Java List.subList是否保留对原始列表的引用?

Java List.subList是否保留对原始列表的引用?,java,Java,如果我有一个变量 LinkedList list 并重复执行以下操作以提取“列表”的尾部 // Some operation that adds elements to 'list' // max_size = some constant list = (LinkedList) list.subList(list.size()-max_size, list.size()); 我是否最终会大量引用“以前的”列表 所以基本上我在这里要做的是删除列表的初始部分 是否有更好的方法删除LinkedLi

如果我有一个变量

LinkedList list
并重复执行以下操作以提取“列表”的尾部

// Some operation that adds elements to 'list'
// max_size = some constant
list = (LinkedList) list.subList(list.size()-max_size, list.size());
我是否最终会大量引用“以前的”列表

所以基本上我在这里要做的是删除列表的初始部分


是否有更好的方法删除LinkedList的初始段?我认为LinkedList的数据结构应该允许线性时间(要删除的初始段的大小是线性的)操作。

当所有其他操作都失败时,请咨询:

返回此列表中指定区域之间部分的视图 从索引(包含)到索引(独占)。(如果来自索引和 toIndex相等时,返回的列表为空。)返回的列表为 受此列表支持,因此在返回的列表中进行非结构性更改 都反映在该列表中,反之亦然。返回的列表支持 此列表支持的所有可选列表操作


如果您需要从列表前面删除元素,则可以使用
removeFirst
,并根据需要多次调用它。

当所有其他操作都失败时,请参阅:

返回此列表中指定区域之间部分的视图 从索引(包含)到索引(独占)。(如果来自索引和 toIndex相等时,返回的列表为空。)返回的列表为 受此列表支持,因此在返回的列表中进行非结构性更改 都反映在该列表中,反之亦然。返回的列表支持 此列表支持的所有可选列表操作


如果您需要从列表前面删除元素,那么您可以使用
removeFirst
,并根据需要多次调用它。

是,引用以下JavaDoc:

返回此列表中指定的fromIndex(包含)和toIndex(独占)之间部分的视图。(如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由该列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然

要避免保留对旧列表的引用(并可能造成内存泄漏),可以根据
子列表创建一个新实例:

list = new ArrayList(list.subList(list.size()-max_size, list.size()));

就这样!与
removeFirst()
相比,这种方法的优点是它可以与任何
列表
实现一起工作-
removeFirst()
仅在
LinkedList
中定义。

是,引用以下JavaDoc:

返回此列表中指定的fromIndex(包含)和toIndex(独占)之间部分的视图。(如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由该列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然

要避免保留对旧列表的引用(并可能造成内存泄漏),可以根据
子列表创建一个新实例:

list = new ArrayList(list.subList(list.size()-max_size, list.size()));

就这样!与
removeFirst()
相比,这种方法的优点是它可以与任何
列表
实现一起工作-
removeFirst()
仅在
LinkedList
中定义。

该代码将失败-返回的子列表不是
LinkedList
。示例程序:

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("x");
        list.add("y");
        list = (LinkedList<String>) list.subList(1, 2);
    }
}
听起来您应该根据需要多次调用
removeFirst

while (list.size() > maxSize) {
    list.removeFirst();
}

该代码将失败-返回的子列表不是
LinkedList
。示例程序:

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("x");
        list.add("y");
        list = (LinkedList<String>) list.subList(1, 2);
    }
}
听起来您应该根据需要多次调用
removeFirst

while (list.size() > maxSize) {
    list.removeFirst();
}

要删除Java中列表的初始段,请执行以下操作:

list.subList(0, numElementsToRemove).clear();

这是因为子列表由原始列表支持(正如Javadoc所说),因此
clear()
会反映到原始列表的范围中。

要删除Java中列表的初始段,请执行以下操作:

list.subList(0, numElementsToRemove).clear();

这是因为子列表是由原始列表支持的(正如Javadoc所说),所以
clear()
会反映到原始列表的范围中。

实际上,他想删除列表的开头,所以他应该使用
removeFirst()
。你知道,我不能从他的问题措辞中看出。编辑我的答案。事实上,他想删除列表的开头,所以他应该使用
removeFirst()
。你知道,从他的问题措辞我真的看不出来。编辑我的答案。