Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素
这是一个一不留神就犯下错误的Java列表ArrayList重复删除元素陷阱,并且问题比较隐蔽。问题描述,假设一个ArrayList存储若干个字符串String元素,这些元素中存在若干重复的、一模一样的元素,编程实现把这些重复元素全部删除。
常见的代码写法是for循环定点删除:
ArrayList<String> mLists = new ArrayList<>(); mLists.add("zhang"); mLists.add("phil"); mLists.add("csdn"); mLists.add("csdn"); mLists.add("csdn"); for (int i = 0; i < mLists.size(); i++) { String s = mLists.get(i); if(s.equals("csdn")) mLists.remove(i); } for(int i=0;i<mLists.size();i++){ System.out.print(mLists.get(i)+" "); }
运行输出:
zhang phil csdn
这个例子中有5个字符串,其中“csdn”重复出现3次,代码本意是把这些重复3此的“csdn”字符串完全删除,结果还有参数,可见没有完全删除,原因是在于Java的ArrayList在删除元素时候,整个队列在动态变化,整个队列的index和长度均在变化中,所以在for循环中游标不准。正确的删除方法是使用Java迭代器Iterator进行删除。 例如代码:
ArrayList<String> mLists = new ArrayList<>(); mLists.add("zhang"); mLists.add("phil"); mLists.add("csdn"); mLists.add("csdn"); mLists.add("csdn"); Iterator<String> iterator = mLists.iterator(); while (iterator.hasNext()) { String s = iterator.next(); if (s.equals("csdn")) { iterator.remove(); } } for (int i = 0; i < mLists.size(); i++) { String s = mLists.get(i); System.out.print(s + " "); }
输出结果正确:
zhang phil
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android--okhttp断点下载+进度
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79753962 import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button downloadBtn1, downloadBtn2, downloadBtn3; private Button cancelBtn1, cancelBtn2, cancelBtn3; private...
- 下一篇
Java 11 发布计划来了,已确定 3个 新特性!!
Oracle 已经发布了 Java Development Kit 10,下一个版本 JDK 11 也在准备之中了。按照 Java 新的版本发布标准,Java 11 将在 6 个月后到来,现在它还只有一部分新功能。 image 据了解,Java 11 将移除 CORBA 和 Java EE(最近更名为 Jakarta EE)模块同时也会移除 JavaFX,因此,Java 11 也将失去一些功能。 与 JDK 10 不同,JDK 11 将成为 Java 平台标准版 Java SE 11 的参考实现。 JDK 11 将在 2023 年 9 月之前从 Oracle 获得首要级别的支持,并将扩展支持,具有补丁和安全警报,直至 2026 年。 计划用于 Java 11 的新功能 目前,JDK 11 只设置了三个新功能,包括: 1、Epsilon 垃圾收集器被称为“no-op”收集器,将处理内存分配而不实施任何实际的内存回收机制。 Epsilon 的使用案例包括测试性能,内存压力和虚拟机界面。 它也可以用于短期工作。 2、lambda 参数的局部变量语法,应该将隐式类型表达式中的形式参数声明的语法...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果