对Java list集合的新认知

383 阅读2分钟

问题描述

一个界面透传集合列表数据到另一个界面,当数据保存后,上个界面列表数据发生改变,反之不变。功能开发完,测试时,修改数据没保存,直接返回,上个界面数据竟然也发生改变了!

思考

  1. 因为用的EventBus进行了传值,第一反应框架的bug?
    大致浏览了EventBus源码,发现值传递过程中,源码没对值做任何操作。
  2. 自己的问题?
    写了个简单demo测试,发现也会有同样的问题。demo测试期间想到,是不是集合赋值给另一个集合,两个集合内存地址用的是同一份,打印两个集合hashCode发现输出内容一致,证明了自己的猜想。

分析

搜索过程中,发现了一篇博文,链接。java list集合底层使用的是数组,数组以地址形式进行存储。当我们调用list集合addAll()方法,或者直接赋值,两个集合内存地址用的是同一份,这就是list集合的浅拷贝。深拷贝就不说了,我认为开发中几乎用不到,而且深拷贝很耗性能的。

问题解决

让两个集合没有任何关联,难道只能用深拷贝去避免吗?实际上,以上问题产生是我对V层理解不够深刻,或者说代码逻辑有问题。因为当用户编辑数据时,我也实时更新集合列表中的数据了。解决上面的问题很简单,用户编辑数据时,不应该实时更新列表数据,而是用户点击保存按钮,再把改变的数据更新到集合中透传回到上个界面。

后记

实际上平常开发中用到的列表展示就是利用了集合的浅拷贝这一特性。只不过开发过程中,没有过多的去思考。这就是典型的只知其然不知其所以然!庆幸的是,通过上述问题的产生,让我对list集合认知更上一层楼,以后再次遇到类似问题,也能快速去解决了。

ps: 在此,厚着脸皮推荐下自己的公众号,公众号主要分享的是我对股市(投资)、楼市、生活的感悟等,技术分享次要(我是个技术萌新)希望会对你有所帮助。

Alt