我偶然发现了一个问题,Java 子列表不返回列表的实例,而是返回列表的视图。这导致线程卡住。
我做了一些谷歌搜索,发现了这个。
是的,List.subList
返回一个视图,如记录:
返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。(如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
是的,在视图上创建视图......最终可能是一个坏主意。
这个故事的寓意不是“不要使用subList
”——它是“确保你知道你调用的方法应该做什么——阅读文档”。
将近8年的线程!但是,我相信我的回答可能会对某人有所帮助。
正如上面 Jon Skeet 所提到的,subList
总是返回对原始列表的引用。一个简单的解决方法是将它分配给一个新的 ArrayList<>
例如:
List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);
x.add(3);
x.add(4);
x.add(5);
List<Integer> y = new ArrayList<Integer>(x.subList(0, 4));