昨天在程序检查时发现的以下的一段程序:
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命令查看实时的系统状态,使用...
* 集合相关问题: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笔试题目.docx" ...* 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。
除了这种方法,Java的Collections类提供了反转ArrayList的方法,虽然这里讨论的是数组,但了解这一点也有助于扩展知识面。例如,如果数组是对象类型的,可以先将其转换为ArrayList,再利用Collections的`reverse`...
1. **初始化**:首先,我们需要选择一个初始点,这可以是可行域内的任意一点,或者通过其他优化策略找到的点。 2. **梯度计算**:在每一步迭代中,我们计算目标函数在当前点的梯度,这是优化过程的关键,因为梯度...