昨天在程序检查时发现的以下的一段程序:
List list = new ArrayList();
Map map = new HashMap();
map.put("id", "1");
map.put("name", "dd");
list.add(map);
map = new HashMap();
map.put("id", "2");
map.put("name", "ff");
list.add(map);
map = new HashMap()后,会发生什么问题呢?
因为list增加过map对象,按照传递指针的方法,那么最后的结果大家都知道了,就是最后list中的两个对象都指向了最后的那个map对象,即包含Id为2的那个map。但是结果是如此吗?
很遗憾,我也被搞混了,结果是正确的,List 包含了两个不同的Map。
带着疑惑google了一下,没有结果。怎么办? 查看一下jdk的源代码可能会有帮助。
public boolean add(Object o) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}
谜底就此揭开,原来ArrayList在实现的时候,在内部维护者一个数组,这样每次add以后,都是由它自身的内部数组对象指向那个对象了。所以上面的答案也就正确了。
虽然用了java很长时间,也以为对常用的比较了解,困惑以后看看jdk源代码看来还是很有帮助的。
分享到:
相关推荐
可以通过调用`TrimToSize()`方法来实现这一点: ```vb mycountries.TrimToSize() ``` 这行代码将确保`ArrayList`只分配足够的内存来存储当前的元素数量。 #### 排序元素 对于需要按照一定顺序显示列表的情况,...
ArrayList的特点是基于数组的数据结构,这使得它在随机访问元素时表现良好,但数组的缺点是容量固定,而ArrayList弥补了这一点,它的容量是动态变化的,能够随着元素的增加而自动扩展。 ### ArrayList类概述 ...
ArrayList 的自动扩容是其最重要的一点。当我们向 ArrayList 中添加元素时,如果当前数组的长度不足以容纳新元素,那么 ArrayList 将扩展其数组的长度,以满足新的存储需求。扩展的规则是将当前数组的长度增加 50%,...
在使用ArrayList.Contains方法时,还有一点需要注意:如果ArrayList中存储的是自定义类型,而这些类型没有重写Equals和GetHashCode,那么默认的相等比较是基于对象的引用,而不是基于对象的值。因此,即使两个对象的...
今天不看源码(想看源码的同学可以自己在...实现RandomAccess接口表示它可以支持随机访问(强调一点,并不是因为实现了RandomAccess接口,ArrayList才支持随机访问。RandomAccess只是一个标记接口,接口RandomAccess中
例如,我们可以创建一个`displayEmployees`方法来实现这一点: ```java public static void displayEmployees(ArrayList<Employee> employees) { for (Employee e : employees) { System.out.println("ID: " + e....
`TrimToSize` 方法可以帮助实现这一点: ```csharp AL.TrimToSize(); ``` 调用后,`ArrayList` 的 `Capacity` 将被调整为当前的 `Count` 大小。 #### 清空 ArrayList 如果需要清空整个 `ArrayList`,可以使用 `...
在队列操作中,需要注意的一点是队列的同步问题。在多线程环境下,需要使用同步机制来避免队列操作的并发问题。此外,队列操作还需要注意队列的容量问题,避免队列溢出等问题。 七、结语 本文主要介绍了Java定义...
"一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...
在“关于做程序开发的一点小的总结”中提到的第一个关键点是自学能力的重要性。在快速变化的IT行业中,新技术不断涌现,旧技术不断被淘汰,因此具备良好的自学能力对于程序员来说至关重要。这不仅包括学习新的编程...
这一点也要看实际情况,若是单挑数据的插入或删除,ArrayList 速度反而由于 LinkedList;若是批量随机的插入或删除数据,LinkedList 速度大大由于 ArrayList。 5. HashMap 和 Hashtable 的区别: - 1、HashMap 是...
5. 云厂商或运营商问题排查,特别是在使用云服务时,云服务提供商的问题也会引起线上故障,排查时不应忽略这一点。 在故障排查时,常见的Linux命令也必须掌握。比如,使用top或htop命令查看实时的系统状态,使用...
List集合可以通过索引访问,这一点类似于数组。同时,List集合支持动态的大小变化,可以在运行时添加或删除元素。List接口的主要实现类有ArrayList和LinkedList。ArrayList基于数组实现,适合于读取操作频繁的场景,...
2. ArrayList:基于数组实现,适合快速随机访问,但在列表中间插入和删除元素时效率较低。 - 常见操作包括:add、remove、get、set、size等。 - 特殊操作包括:list.toArray(), list.indexOf(), list.contains()等...
* 集合相关问题:HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList 的底层实现,HashMap 和 Hashtable 的区别,ArrayList、LinkedList、Vector 的区别等。 * 多线程并发相关问题:创建线程的 3 种...
本主题围绕“CodingJava:只是解决了一点问题”,我们将深入探讨Java编程中的关键概念和技术,以及如何解决常见问题。 1. **基础语法**:Java的基础语法与C++类似,但更加简洁且具有自动内存管理。了解基本数据类型...
- 软件学院05级OOP第二次测验试题及答案.doc:这可能是关于面向对象编程的一次测试,包括类、对象、封装、继承、多态等概念。 - OOP是Java的核心,理解类的定义、对象的创建和销毁、属性与方法的封装、单一职责...
4. 集合框架:ArrayList、LinkedList、HashSet、HashMap等,以及它们的操作方法。 5. 输入/输出流:处理文件读写和网络通信。 6. 多线程:并发编程,理解Thread类和Runnable接口,以及同步机制(synchronized关键字...
Java集合类中的ArrayList或LinkedList可以很方便地实现这一点。这里我们选择ArrayList,因为它的插入和访问速度较快。 ```java import java.util.ArrayList; import java.util.Collections; ArrayList<Integer> ...
理解这一点对于编写健壮且功能丰富的程序代码至关重要,尤其是在处理集合数据时,能够正确地进行比较操作可以避免很多逻辑错误。 在实际编程中,理解并掌握Java集合框架的这些特性,可以帮助开发者更加高效地处理...