昨天在程序检查时发现的以下的一段程序:
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源代码看来还是很有帮助的。