使用 Java 的 ArrayList 踩过的那些坑

平时开发中,ArrayList 的使用频率是相当高的,但一不小心就容易踩坑,在这里记录一下。

1. 使用 Arrays.asList 的坑

使用场景

正常使用 Arrays.asList 不会有太大问题

List<Integer> testList = Arrays.asList(1, 2, 3);

添加一个元素,理想状态会输出结果:true

testList.add(4);
System.out.println(testList.contains(4));

实际运行却会报错:
在这里插入图片描述

分析

正常我们使用的 ArrayList 是 java.util 下的,而查看源码可以发现,asList 返回的 ArrayList 实际上是 Arrays 类的内部类,而这个内部类没有重写 add 方法,所以会报错。
在这里插入图片描述
所以科学的使用姿势是,在声明后就不要再调用 add 方法修改集合,可以提前修改后再进行转换。

2. 使用 ArrayList 的 subList 的坑

使用场景

(1). 修改原集合的值,会影响子集合

List<String> testList = new ArrayList<>();
testList.add("123");
testList.add("456");
testList.add("789");

List<String> subList = testList.subList(1, 3);
System.out.println(testList);
System.out.println(subList);

// 修改原集合的值
testList.set(2,"222");

System.out.println(testList);
System.out.println(subList);

输出结果:
在这里插入图片描述
(2). 原集合添加值,子集合遍历会报错

List<String> testList = new ArrayList<>();
testList.add("123");
testList.add("456");
testList.add("789");

List<String> subList = testList.subList(1, 3);
System.out.println(testList);
System.out.println(subList);

// 原集合添加新的值
testList.add("222");

System.out.println(testList);
System.out.println(subList);

运行程序会报错:
在这里插入图片描述
(3). 子集合添加或修改值,会影响原集合

List<String> testList = new ArrayList<>();
testList.add("123");
testList.add("456");
testList.add("789");

List<String> subList = testList.subList(1, 3);
System.out.println(testList);

// 子集合添加值
subList.add("222");
// 子集合修改值
subList.set(0, "000");

System.out.println(testList);

会发现原集合也发生了改变:
在这里插入图片描述

分析

查看一下 subList 的源码:
在这里插入图片描述
发现调用了 SubList 类的构造函数:
在这里插入图片描述
这里的构造函数并没有重新创建 ArrayList,所以修改原集合或者子集合的值,就会发生相互影响的情况了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛夏温暖流年

可以赏个鸡腿吃嘛~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值