Java中集合处理要点

subList:

ArrayList的subList结果不可强转成ArrayList。
原因: subList返回的是ArrayList的内部类SubList,它并不是ArrayList而是ArrayList的一个视图,所以直接强转ArrayList会报错。

在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException异常。

toArray()方法:

无参: 返回结果是Object[]类,不可强转为其它类型数组,但是通过Arrays.toString可输出基本类型的结果。
有参toArray(T[] array): 将集合内的元素给array赋值,如果array不够大,则将array置空,重新分配内存,返回一个赋值好的新数组。而array过大时,多余元素为null。
示例:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
String[] strings1 = new String[1],strings2 = new String[2],strings3 = new String[3];
list.toArray(strings1);
System.out.println("strings1:" + Arrays.toString(strings1));
strings1 = list.toArray(strings1);
System.out.println("strings1:" + Arrays.toString(strings1));
list.toArray(strings2);
System.out.println("strings2:" + Arrays.toString(strings2));
list.toArray(strings3);
System.out.println("strings3:" + Arrays.toString(strings3));

输出:
在这里插入图片描述
日常使用应该为:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
String[] strArray = new String[list.size()];
strArray = list.toArray(strArray);

Arrays.asList():

使用Arrays.asList()将数组转化为集合时,不能使用修改集合相关的方法(add/remove/clear),否则会导致UnsupportedOperationException异常
原因: asList()方法返回的集合ArrayList是Arrays的内部类,并非是java.util.ArrayList,而在这个内部类ArrayList中,实际上数据的存储还是数组形式,而且是指向原来的数组,所以无法使用修改集合的方法,并且修改该集合上的内容会影响到原来数组。
asList方法:
asList
内部类ArrayList:
内部类ArrayList
示例:

Integer[] nums = {1,2,3,4};
System.out.println(Arrays.toString(nums));
List<Integer> list = Arrays.asList(nums);
list.set(0,2);
System.out.println(Arrays.toString(nums));

结果:
测试asList

remove/add:

在foreach循环里进行元素的remove/add操作会导致ConcurrentModificationException异常。remove元素需要使用Iterator方式。
原因: 由于每次对集合的remove/add操作会导致modCount加一,而expectedModCount和modCount不相同会导致ConcurrentModificationException异常。
解决方法: 使用迭代器来代替foreach。
代码:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
	String string = iterator.next();
	if ("1".equals(string))
		iterator.remove();
}

`

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值