【发布时间】:2022-01-02 17:36:47
【问题描述】:
我有两个版本的代码会截断现有列表:
版本 1:
List<String> myList = User.getAllNames();
myList = myList.stream().sorted(sortByName).limit(5).collect(Collectors.toList());
版本 2:
List<String> myList = User.getAllNames();
myList.sort(sortByName);
myList = myList.subList(0, 5 - 1);
版本 3:
List<String> myList = User.getAllNames();
myList = new ArrayList<BacktestResult>(myList.subList(0, 5 - 1));
您可以假设,没有其他对象引用被剪裁的元素。两个版本都通过重新分配截断myList。由于 version 2 仅使用由其原始列表烘焙的 subList,我怀疑 version 2 是否也完全从 java 堆中删除了裁剪的元素(之后垃圾收集)就像 版本 1 一样。
我需要知道的主要事情是,如果版本 2 也像版本 1 那样从 Java 堆(垃圾收集之后)中完全删除被剪裁的元素。
【问题讨论】:
-
回答你用粗体表示的问题:总之,有很多不同。
-
我需要知道的主要事情是,正如我在问题中所说:“如果版本 2 也像版本 1 一样从 Java 堆中(垃圾收集之后)完全删除剪辑元素”。
-
原则上也不做。
subList返回由原始列表支持的 视图,因此您可以认为所有列表元素都“固定”到堆中,因此至少在列表处于活动状态时可以通过强引用访问。 -
而且,我可能不会称其为“截断”:两种情况下的原始列表均不受影响。使用
remove()删除元素真的会截断它。
标签: java collections