关于ArrayList的一点问题

本文通过一段具体的Java代码示例,详细解释了ArrayList如何处理Map对象的添加过程,并揭示了即使Map对象被重新赋值,List中存储的对象引用也不会随之改变的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    昨天在程序检查时发现的以下的一段程序:

      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源代码看来还是很有帮助的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值