唐僧大官人 2014-10-21 09:24 采纳率: 0%
浏览 2126

对象数组中修改引用指向集合变化问题

今天遇到一个问题,越想越想不明白,贴出来请大家帮帮忙

ObLocateMain main = new ObLocateMain();
List mainList = new ArrayList();
mainList.add(main);
main.setOutboundNo("111111111111");
main = new ObLocateMain();
main.setOutboundNo("222222222222");
mainList.add(main);
mainList.get(0).setOutboundNo("333333333333");
System.out.println("---------------------------------");
上面的代码现在有个问题不能理解
给outboundNO对象赋值后,集合里的main对象应该也有值了(这可以理解)
main = new ObLocateMain(); 之后,按照我的理解集合里的main对象应该也是一个新的new的一个对象,但是实际上集合里对象还是之前的main对象(给outboundNo赋值后的对象)
这是为什么呢,集合归根结底还是维护的数组,我理解的是将main这个引用指向一个新的对象的时候为什么集合里的没有变化呢,集合里main的引用和外面的不是一个吗?

  • 写回答

1条回答

  • three_man 2014-10-21 13:00
    关注

    这样看看能不能说明白啊。

    上述过程如果不是集合的话,你的程序相当于:
    ObLocateMain main = new ObLocateMain();
    main.setOutboundNo("111");
    ObLocateMain main2 = main;
    main = new ObLocateMain();
    main.setOutboundNo("222");
    System.out.println(main2.getOutboundNo());
    System.out.println(main.getOutboundNo());

    针对你的程序
    首先第一行你new ObLocateMain();这样在堆中有了一个ObLocateMain的实例i1。
    这时这个main引用指向了i1.

    第三行mainList.add(main);之后呢。
    实际上是ArrayList中的数组中的一个元素赋值为i1的引用
    elementData[size++] = e -->i1;

    然后呢,第五行main = new ObLocateMain();
    把main改为了到另外一个ObLocateMain实例i2的引用。
    第七行把ArrayList中的下一个元素指向了i2.

    执行完之后呢
    elementData[0] 的值是包含了i1的引用
    elementData[1] 的值是包含了i2的引用

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?