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()
。你知道,从他的问题措辞我真的看不出来。编辑我的答案。