List.sublist(n,m) 的观点是什么?

Joe*_*oel 5 java arraylist classcastexception java-8

我正在尝试将其切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
Run Code Online (Sandbox Code Playgroud)

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

Era*_*ran 4

ArrayList的方法返回被调用( )subList的内部类的实例,而不是. 您可以将其存储在变量中,但不能将其转换为.ArrayListSubListprivate class SubList extends AbstractList<E> implements RandomAccessArrayListListArrayList

如果你希望你的子列表是一个独立的ArrayList,你可以创建一个新的ArrayList:

out1 = new ArrayList<String> (in.subList(0,2)); 
out2 = new ArrayList<String> (in.subList(2,5));
Run Code Online (Sandbox Code Playgroud)

  • @Joel的想法是,它不会为新的ArrayList创建新的存储,如果原始的ArrayList很大并且您需要它的一个大的子列表,这很有用。它不是将所有元素复制到新列表,而是保存对原始列表的引用。例如,get(i)被实现为“return ArrayList.this.elementData(offset + index);”(即它从原始ArrayList获取元素) (6认同)
  • 它不仅避免复制,而且是某些列表操作的预期习惯用法,例如要删除索引范围“(4, 10)”中的所有项目,请使用“list.subList(4, 10).clear();”比多次调用 `remove()` 更简洁、更高效。您还可以将子列表与 [`fill`](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#fill-java.util.List-T-) 结合起来, [`replaceAll`](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#replaceAll-java.util.List-TT-),`复制`,`旋转`、`反向`、`排序`等。 (6认同)