JAVA-ArrayList的相关坑

本文主要讨论了ArrayList的asList()方法,它返回固定大小的列表且不支持动态添加。subList()方法则返回视图,修改父集合会影响子集,可能导致ConcurrentModificationException。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList的asList()方法

  1. Arrays.asList()方法,本质是调用了Arrays的一个静态内部类,实现了AbstractList接口,这个方法是重写了AbstractList的方法,但是这个asList()大小是固定的,当我们使用add方法时会调用父类AbstractList的add方法,通过代码可以看出,该实现逻辑是直接抛异常
public void add(int index, E element) {
    throw new UnsupportedOperationException();
}
  1. ArrayList的subList()获得的子集合存在以下特点
    • subList,获取原集合可以通过索引获取,原则是:左开右闭
List<String> firstList= new ArrayList<>();
firstList.add("1111");
firstList.add("22");
firstList.add("333");
firstList.add("44");
firstList.add("55");

List<String> secondList= bookList.subList(3, 5);
  • 修改原集合,会影响到子集合
  • 修改原集合结构,会引起ConcurrentModificationException异常-- 即:你给原集合添加一个元素,然后遍历子集合会导致异常
  • 修改子集合元素的值,会影响原集合
  • 修改子集合的结构,会影响原集合

在subList场景中,对父集合元素的增加或删除,均会导致子列表的遍历、修改、删除产生ConcurrentModificationException异常

  1. 总结:ArrayList的subList方法,返回的是ArrayList的一个视图,修改父集合会导致子集合修改。修改子集合会导致父集合修改。添加父集合元素会导致子集合报异常。
  2. Arrays的asList()方法。返回的是一个固定大小的ArrayList,添加元素会报异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值