Java集合删除元素ArrayList实例详解

AbstractCollection集合类中有一个remove方法,该方法为了适配多种不同的集合,允许删除空的元素,看这部分代码的时候产生了疑问,为什么这里直接用it.remove()就直接删除了?
public boolean remove(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}
接下来,拿ArrayList为例子,进行说明。其继承结构如下图所示。并且,ArrayList内部有其使用的Iterator的实现类。
编写一段测试代码:
AbstractCollection<String> list = new ArrayList<>();
list.add("a");
list.add(null);
list.add(null);
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
if(iter.next() == null) {
iter.remove();
}
}
System.out.println(list);
关键点还是在于iter.next() == null 这一行,next的源码如下:
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
cusor在这里表示的是遍历时的索引,在调用next方法的时候其实cusor已经指向了当前元素的下一个元素,而使用lasrRet来获取当前的索引上的数据并将其返回。
而remove()方法中是通过lastRet的索引进行删除的。
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
借助上文中提到的测试实例,可以进行每一步的推算。
1. 调用next()方法,cursor指向0号元素,i被赋值为cursor的值,然后cursor被修改为i+1,指向了1号元素,也就是null所在的位置, lastRet被赋值为0。
2. 调用next()方法,cursor指向了1号元素,赋值给i,然后cursor又通过i+1递增变为2,lastRet被赋值为1
3. 执行删除,删除该集合lastRet上所代表的元素。删除完成后修改cursor指针同时使得expectedModCount和modCount保持一致避免fastfail。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java集合删除元素ArrayList
# java
# ArrayList
# 删除元素
# java ArrayList集合中的某个对象属性进行排序的实现代码
# java集合类arraylist循环中删除特定元素的方法
# Java中ArrayList集合的常用方法大全
# Java ArrayList集合详解(Java动态数组)
# Java的List集合框架之ArrayList详解
# 在java中ArrayList集合底层的扩容原理
# Java中的ArrayList集合源码解析
# Java ArrayList集合之解锁数据存储新姿势
# 值为
# 的是
# 在这里
# 这部
# 希望能
# 所示
# 谢谢大家
# 如下图
# 这一行
# 有一个
# 类中
# 产生了
# 完成后
# 并将其
# hasNext
# iterator
# gt
# lt
# null
# false
相关文章:
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
企业微网站怎么做,公司网站和公众号有什么区别?
网站制作难吗安全吗,做一个网站需要多久时间?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何做网站制作流程,*游戏网站怎么搭建?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
制作电商网页,电商供应链怎么做?
香港服务器选型指南:免备案配置与高效建站方案解析
南平网站制作公司,2025年南平市事业单位报名时间?
网站制作价目表怎么做,珍爱网婚介费用多少?
宝塔建站无法访问?如何排查配置与端口问题?
制作宣传网站的软件,小红书可以宣传网站吗?
文字头像制作网站推荐软件,醒图能自动配文字吗?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
c# 在高并发下使用反射发射(Reflection.Emit)的性能
C#如何序列化对象为XML XmlSerializer用法
如何自定义建站之星网站的导航菜单样式?
如何配置IIS站点权限与局域网访问?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
招贴海报怎么做,什么是海报招贴?
如何在建站宝盒中设置产品搜索功能?
建站主机核心功能解析:服务器选择与网站搭建流程指南
盘锦网站制作公司,盘锦大洼有多少5G网站?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何高效生成建站之星成品网站源码?
如何通过网站建站时间优化SEO与用户体验?
如何制作网站标识牌,动态网站如何制作(教程)?
建站DNS解析失败?如何正确配置域名服务器?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何高效搭建专业期货交易平台网站?
如何用景安虚拟主机手机版绑定域名建站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
在线制作视频的网站有哪些,电脑如何制作视频短片?
音乐网站服务器如何优化API响应速度?
如何用AWS免费套餐快速搭建高效网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
h5在线制作网站电脑版下载,h5网页制作软件?
七夕网站制作视频,七夕大促活动怎么报名?
如何安全更换建站之星模板并保留数据?
视频网站制作教程,怎么样制作优酷网的小视频?
建站之星价格显示格式升级,你的预算足够吗?
宝塔Windows建站如何避免显示默认IIS页面?
*请认真填写需求信息,我们会在24小时内与您取得联系。