【Java】List的subList方法

Java的容器类ArrayList很常用,旗下存在一个subList方法,是值得注意的。

【Java】List的subList方法_第1张图片

subList方法仅能够取出此ArrayList的引用,即使其看起来,好像是取出一个ArrayList的子ArrayList。

【Java】List的subList方法_第2张图片

其实不然,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());
	}

}

将会抛出java.util.ConcurrentModificationException。

【Java】List的subList方法_第3张图片

显然对原有的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。

你可能感兴趣的:(java,ArrayList,容器,子集,subList)