Java的容器类ArrayList很常用,旗下存在一个subList方法,是值得注意的。
subList方法仅能够取出此ArrayList的引用,即使其看起来,好像是取出一个ArrayList的子ArrayList。
其实不然,subList方法的返回值,只是ArrayList的一个映像而已。
也就是说,当我们使用子集合subList进行元素的修改操作时,会影响原有的list集合。
比如如下的一段代码:
package subList; import java.util.*; public class subListTest { public static void main(String[] args) { List<String> arrayList = new ArrayList<String>(); arrayList.add("a"); arrayList.add("b"); arrayList.add("c"); List<String> arrayList_subList = arrayList.subList(0, 2); arrayList.remove(0); arrayList.add("d"); System.out.println(arrayList_subList.size()); } }
显然对原有的list集合的修改相应到subList方法返回的arrayList_subList。
Java中的subList方法,并不是提供用来生成子集合的,如果要用来生成子集合,还是采取如下的一种硬复制形式为好,而不是subList软复制:
package subList; import java.util.ArrayList; public class subListTest { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("a"); arrayList.add("b"); arrayList.add("c"); arrayList.add("d"); ArrayList<String> arrayList_sublist = new ArrayList<String>(); for(int i=1;i<=2;i++){ arrayList_sublist.add(arrayList.get(i)); } System.out.println(arrayList_sublist); } }
subList方法,常见于两种方法,一种是取出ArrayList的某一段配合indexOf和lastIndexOf构造类似的语句。判断某段子集合是否符合条件。而且 Collections 类中的所有算法都可以应用于subList。如果支持列表(即此列表)通过任何其他方式(而不是通过返回的列表)从结构上修改,则此方法返回的列表语义将变为未定义。这里的“从结构上修改”是指更改列表的大小,或者以其他方式打乱列表,使正在进行的迭代产生错误的结果。
另一种是删除ArrayList的某一段集合,例如如下代码:
package subList; import java.util.ArrayList; public class subListTest { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("a"); arrayList.add("b"); arrayList.add("c"); arrayList.add("d"); System.out.println(arrayList); arrayList.subList(1,3).clear(); System.out.println(arrayList); } }
abcd这个集合的1(含)-3(不含),即从0开始算起,第1、2号元素被删去了,形成了一个新的集合ab。