【问题标题】:What is the view of List.sublist(n,m)?List.sublist(n,m) 的观点是什么?
【发布时间】:2015-09-28 16:36:50
【问题描述】:

我正在尝试将ArrayList<String> 分成两半。

ArrayList<String> in = new ArrayList<>(), out1, out2;
out1 = (ArrayList<String>) in.subList(0,2); //will cause an ClassCastException: List cannot be casted to ArrayList
out2 = (ArrayList<String>) in.subList(2,5); // either here

为什么?视图代表什么,子列表返回哪个?

【问题讨论】:

    标签: java arraylist java-8 classcastexception


    【解决方案1】:

    ArrayListsubList 方法返回称为SubList (private class SubList extends AbstractList&lt;E&gt; implements RandomAccess) 的ArrayList 内部类的实例,而不是ArrayList。您可以将其存储在 List 变量中,但不能将其转换为 ArrayList

    如果你想让你的子列表成为一个独立的 ArrayList,你可以创建一个新的 ArrayList :

    out1 = new ArrayList<String> (in.subList(0,2)); 
    out2 = new ArrayList<String> (in.subList(2,5));
    

    【讨论】:

    • 所以它既不是 ArrayList 也不是链表?子列表在内存中是如何表示的?
    • @Joel 它是由原始的ArrayList支持的。
    • 为什么不只是arrayList的一个实例? - 不返回原始类型有什么好处?
    • @Joel 这个想法是它不会为新的 ArrayList 创建新的存储,如果原始 ArrayList 很大并且您需要它的大子列表,这很有用。它没有将所有元素复制到一个新的 List 中,而是保留了对原始 List 的引用。例如,get(i) 实现为return ArrayList.this.elementData(offset + index);(即从原始ArrayList 中获取元素)
    • 这不仅避免了复制,而且是某些列表操作的预期惯用语,例如要删除索引范围(4, 10) 中的所有项目,请使用list.subList(4, 10).clear();,这比多次调用remove() 更简洁高效。您还可以将子列表与fillreplaceAllcopyrotatereversesort 等组合在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-09-11
    • 2020-10-20
    • 2012-05-12
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多