【Java】List的subList方法

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());
	}

}

将会抛出java.util.ConcurrentModificationException。


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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值