Java面试题篇·(大神分享总结,字节跳动Java内部学习资料泄露

让我们看下它的源码:

可以看出,每次删除一个元素,都会将modCount的值重新赋值给expectedModCount,这样2个变量就相等了,不会触发java.util.ConcurrentModificationException异常。
#3. 使用for循环正序遍历
使用for循环正序遍历的实现方式如下所示:

public static void main(String[] args) {
List platformList = new ArrayList<>();
platformList.add(“博客园”);
platformList.add(“CSDN”);
platformList.add(“掘金”);

for (int i = 0; i < platformList.size(); i++) {
String item = platformList.get(i);

if (item.equals(“博客园”)) {
platformList.remove(i);
i = i - 1;
}
}

System.out.println(platformList);
}

这种实现方式比较好理解,就是通过数组的下标来删除,不过有个注意事项就是删除元素后,要修正下下标的值:

i = i - 1;

为什么要修正下标的值呢?

因为刚开始元素的下标是这样的:

第1次循环将元素"博客园"删除后,元素的下标变成了下面这样:

第2次循环时i的值为1,也就是取到了元素”掘金“,这样就导致元素"CSDN"被跳过检查了,所以删除完元素后,我们要修正下下标,这也是上面代码中i = i - 1;的用途。
#4. 使用for循环倒序遍历
使用for循环倒序遍历的实现方式如下所示:

public static void main(String[] args) {
List platformList = new ArrayList<>();
platformList.add(“博客园”);
platformList.add(“CSDN”);
platformList.add(“掘金”);

for (int i = platformList.size() - 1; i >= 0; i–) {
String item = platformList.get(i);

if (item.equals(“掘金”)) {
platformList.remove(i);
}
}

System.out.println(platformList);
}

这种实现方式和使用for循环正序遍历类似,不过不用再修正下标,因为刚开始元素的下标是这样的:

第1次循环将元素"掘金"删除后,元素的下标变成了下面这样:

第2次循环时i的值为1,也就是取到了元素”CSDN“,不会导致跳过元素,所以不需要修正下标。
#5. 评论区释疑(2020-06-15更新)
5.1 使用removeIf()方法(推荐)
从JDK1.8开始,可以使用removeIf()方法来代替 Iterator的remove()方法实现一边遍历一边删除,其实,IDEA中也会提示:

所以原来的代码:

Iterator iterator = platformList.iterator();
while (iterator.hasNext()) {
String platform = iterator.next();
if (platform.equals(“博客园”)) {
iterator.remove();
}
}

就可以简化为如下所示的1行代码,非常简洁:

platformList.removeIf(platform -> “博客园”.equals(platform));

看下removeIf()方法的源码,会发现其实底层也是用的Iterator的remove()方法:

5.2 使用for循环正序遍历,是否需要修正下标?
先说结论:需要。

不过之前文中举得例子不是太好,所以好多读者看完认为不修正下标也是可以的,其实不是,我们换个例子来理解:

List platformList = new ArrayList<>();
platformList.add(“博客园”);
platformList.add(“博客园”);
platformList.add(“CSDN”);
platformList.add(“掘金”);

for (int i = 0; i < platformList.size(); i++) {
String item = platformList.get(i);
if (“博客园”.equals(item)) {
platformList.remove(i);
}
}

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-G8u8ziD5-1710828775915)]

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值