Java中List.clear()方法异常行为的技术求助
为什么复用List对象添加到外层列表后调用clear()会导致外层列表为空?
这是Java中引用类型的特性导致的:你在外层List<List<String>>中添加的不是little_list的副本,而是指向同一个ArrayList对象的引用。所有操作都是针对这个唯一的对象进行的,最终自然会出现外层列表全空的情况。
分析第一个代码的执行过程
List<List<String>> list = new ArrayList<>(); List<String> little_list = new ArrayList<>(); for(int i = 0 ; i < 3 ; i++){ little_list.add("Hello"); list.add(little_list); little_list.clear(); }
- 初始化阶段:只创建了一个
ArrayList实例,little_list变量保存着指向它的引用。 - 每一轮循环:
- 往这个唯一的实例里添加"Hello";
- 将
little_list的引用存入外层list,此时外层list的元素只是指向同一个对象的“指针”; - 调用
clear()清空这个实例的元素——因为外层list里的所有引用都指向它,所以所有元素对应的内容都会被清空。
- 三次循环结束后,外层
list里的三个元素全部指向这个被清空的ArrayList实例,所以最终外层列表看起来是空的。
对比第二种写法的逻辑
List<List<String>> list = new ArrayList<>(); List<String> little_list; for(int i = 0 ; i < 3 ; i++){ little_list = new ArrayList<>(); little_list.add("Hello"); list.add(little_list ); }
这里每一轮循环都会执行new ArrayList<>(),也就是创建一个全新的ArrayList实例,little_list每次指向不同的对象。外层list添加的是不同对象的引用,每个对象都独立持有自己的"Hello",彼此互不影响,因此结果完全正常。
额外补充:如果想复用little_list怎么办?
如果一定要复用little_list,可以在添加到外层列表时,传入它的副本而非原引用:
list.add(new ArrayList<>(little_list));
这样外层列表保存的是新创建的ArrayList实例(复制了原little_list的元素),后续调用little_list.clear()只会清空原对象,不会影响外层列表里的元素。
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

