list.sublist() 和 stream.limit() 之间的差异
Differences between list.sublist() and stream.limit()
我有两个截断现有列表的代码版本:
版本 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 堆(在垃圾收集之后),就像 version 1 那样。
我需要知道的主要事情是,如果版本 2 也像版本 1 一样从 java 堆中(在垃圾收集之后)完全删除被剪裁的元素。
I'm in doubt if version 2 also removes the clipped elements totally from the java heap (after garbage collection)
假设没有其他对象引用被剪裁的元素,在版本 1 的情况下,它们将有资格进行垃圾回收。
在版本 2 的情况下,由于生成的子列表是原始列表的“视图”,因此子列表需要保留对原始列表的引用,其中包含所有被剪切的元素。因此,那些被裁剪的元素将不符合垃圾回收的条件。
版本 3 与版本 1 类似。您丢弃 sublist
生成的视图,因此它将有资格进行 GC。 myList
成为一个新列表,仅引用原始列表的第一个元素。现在没有变量直接或间接引用原始列表的最后一个元素,因此它们符合 GC 条件。
也就是说,除非您的列表有 很多 个元素,否则这可能无关紧要。
我有两个截断现有列表的代码版本:
版本 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 堆(在垃圾收集之后),就像 version 1 那样。
我需要知道的主要事情是,如果版本 2 也像版本 1 一样从 java 堆中(在垃圾收集之后)完全删除被剪裁的元素。
I'm in doubt if version 2 also removes the clipped elements totally from the java heap (after garbage collection)
假设没有其他对象引用被剪裁的元素,在版本 1 的情况下,它们将有资格进行垃圾回收。
在版本 2 的情况下,由于生成的子列表是原始列表的“视图”,因此子列表需要保留对原始列表的引用,其中包含所有被剪切的元素。因此,那些被裁剪的元素将不符合垃圾回收的条件。
版本 3 与版本 1 类似。您丢弃 sublist
生成的视图,因此它将有资格进行 GC。 myList
成为一个新列表,仅引用原始列表的第一个元素。现在没有变量直接或间接引用原始列表的最后一个元素,因此它们符合 GC 条件。
也就是说,除非您的列表有 很多 个元素,否则这可能无关紧要。