首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ArrayList分析3 : 删除元素

ArrayList分析3 : 删除元素 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/16421743.html 对于集合类删除元素是常有的需求,非常常见;如果是惯常的删除方式就没有写本篇博客的必要了...,本篇博客不光分析删除可能导致的问题,也会从源码层面分析为何需要借用迭代器删除,同时也会给出不同业务形态下的删除方式等,有兴趣的往下看看囖 一.循环与非循环内删除 这是两种不同的业务形态,如果是确定待删除元素的索引位置或元素值且只删除一个元素的情况下...,一般是直接调用ArrayList下的remove删除方法,但这不是本篇重点 public static void main(String[] args) { ArrayList...,一般不能确定待删除元素的索引位置,这样就需要在循环内删除了; public static void main(String[] args) { ArrayList arr =...三.普通删除做了什么 这是ArrayList的remove源码: public E remove(int index) { rangeCheck(index);

25830

ArrayList边遍历边删除

, 返回值为被删对象 //删除指定对象,只删除第一个相同的对象,返回值表示是否删除了元素 //如果o为null,则删除值为null的元素 public boolean remove(Object o)...public void clear() //删除所有元素 //在指定位置插入元素,index为0表示插入最前面,index为ArrayList的长度表示插到最后面 public void add(int...super E> filter) //删除符合filter条件的元素 边遍历边删除 需求:在包含0,1,2,3,4,5的集合中,删除大于2的数字 错误例子1 package cn.dhbin.arraylist...} } System.out.println(list); } } 一个for循环遍历,如果item > 2就执行remove,看上去似乎没有问题的样子...所谓结构性变化就是添加、插入和删除元素,只是修改元素内容不算结构性变化。如何避免这个异常呢?

1.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

ArrayList的循环中删除元素,会不会出现问题

ArrayList 的循环中删除元素,会不会出现问题?我开始觉得应该会有什么问题吧,但是不知道问题会在哪里。在经历了一番测试和查阅之后,发现这个“小”问题并不简单!...不在循环中的删除,是没有问题的,否则这个方法也没有存在的必要了嘛,我们这里讨论的是在循环中的删除,而对 ArrayList 的循环方法也是有多种的,这里定义一个类方法 remove(),先来看段代码吧。...删除这种元素时,方法一在删除重复但不连续的元素时是正常的,但在删除重复且连续的元素时,会出现删除不完全的问题,这种删除方式也是用到了 ArrayList 中的 remove() 方法。...经过对运行结果的分析,发现问题都指向了 ArrayList 中的 remove() 方法,(感觉有种侦探办案的味道,可能是代码写多了的错觉吧,txtx...)那么看 ArrayList 源码是最好的选择了...,发散一下思维,Python 中的列表删除会不会也有这样的问题呢,我抱着好奇试了试,发现下面的方法一也同样存在不能删除连续重复元素的问题,方法二则是报列表下标越界的异常,测试代码如下,这里我只测试了单线程环境

2.8K20

ArrayList删除姿势你都掌握了吗

引言 前几天有个读者由于看了《ArrayList哪种遍历效率最好,你真的弄明白了吗?》问了个问题普通for循环ArrayList为什么不能删除连续重复的两个元素?其实这个描述是不正确的。...正确的应该是普通for循环正序删除,不能删除连续的元素所以就产生了这个文章。 ? ArrayList删除数据的方式 我们先看下ArrayList总共有几种删除元素的方法吧。...package com.workit.demo.array; import java.util.ArrayList; import java.util.Iterator; import java.util.List...> getList() { List list = new ArrayList(); list.add("a"); list.add(...增强版for循环删除 && 迭代器循环使用ArrayList.remove()方法删除 增强版for循环删除(deleteByEnhancedForLoop)、迭代器循环,使用ArrayList的remove

51730

ArrayList源码解析(基于Java8)扩容删除

首先:执行List list1 = new ArrayList(); 在堆内存开辟了一块空间,既然是new出来的,那我们直接从构造函数入手 很简单一行代码,继续看一下...很简单,就是返回size值,而不是底层数组的长度,就是为何String里叫length()而List里叫size()的原因 有人说,诶,就一个元素,在堆内存中占了10个位置,好浪费啊,没办法,你要享受ArrayList...的便利与丰富的API,就得牺牲一下空间作为代价 ArrayList还提供了其它构造方法,我们顺便来看一下 public ArrayList(int initialCapacity) {...在长度为n数组中: 直接通过下标去访问元素,时间复杂度为O(1) 需要循环查找元素的时候,时间复杂度为O(n) 删除 删除指定位置的元素 public E remove(int index) {...我们再看另外一种删除方式 删除指定对象元素 public boolean remove(Object o) { //如果要删除的元素为null if (o == null

1.1K81

ArrayList删除姿势你都知道了吗

引言 前几天有个读者由于看了《ArrayList哪种遍历效率最好,你真的弄明白了吗?》问了个问题普通for循环ArrayList为什么不能删除连续重复的两个元素?其实这个描述是不正确的。...正确的应该是普通for循环正序删除,不能删除连续的元素所以就产生了这个文章。 ? ArrayList删除数据的方式 我们先看下ArrayList总共有几种删除元素的方法吧。...package com.workit.demo.array; import java.util.ArrayList; import java.util.Iterator; import java.util.List... static  List getList() {         List list = new ArrayList();         list.add("a"...增强版for循环删除 && 迭代器循环使用ArrayList.remove()方法删除 增强版for循环删除(deleteByEnhancedForLoop)、迭代器循环,使用ArrayList的remove

78640

如何遍历ArrayList集合,并安全删除其中的元素

如何遍历ArrayList集合,并安全删除其中的元素?...1、遍历ArrayList集合有三种方式 (1)for循环 (2)增强for循环,也就是foreach (3)迭代器iterator 2、普通for循环遍历删除元素,list集合的大小会变小...例如我for循环遍历删除第一个元素,接着按照索引去寻找第二个元素,由于删除的关系 后面所有的元素都会往前面移动一位,就会导致按照索引得到的是第三个元素。...使用迭代器循环遍历删除某些元素,不会出现问题,但是我们要注意的是,使用的是 iteraror.remove()方法,而不是list.remove()方法;如果使用的是list的remove方法,...如果要循环遍历删除多个元素,最好使用迭代器。

93820

ArrayList与CopyOnWriteArrayList常见操作与问题

ArrayList循环遍历并删除元素的常见陷阱 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。...不妨把这个问题当做一道面试题目,我想一定能难道不少的人。今天就给大家说一下在ArrayList循环遍历并删除元素的问题。...针对这种情况可以倒序删除的方式来避免: public static void remove(ArrayList list) { for(inti=list.size()-1;i>...错误二产生的原因却是foreach写法是对实际的Iterable、hasNext、next方法的简写,问题同样处在上文的fastRemove方法中,可以看到第一行把modCount变量的值加一,但在ArrayList...COW 的缺点 CopyOnWrite 容器有很多优点,但是同时也存在两个问题,即内存占用问题和数据一致性问题。所以在开发的时候需要注意一下。

68710

ArrayList在foreach删除倒数第二个元素不抛并发修改异常的问题

平时我们使用ArrayList比较多,但是我们是否知道ArrayList在进行foreach的时候不能直接通过list的add或者move方法进行删除呢, 原因就是在我们进行foreach遍历的时候,其实底层原理就是使用了...iterator 迭代器进行操作的,我们在foreach中使用list的add 或者 move 方法;会导致并发修改异常抛出; ArrayList是java开发时非常常用的类,常碰到需要对ArrayList...循环删除元素的情况。...比如下面的代码就会抛这个异常: List list = new ArrayList(); list.add("1"); list.add("2"); list.add...接下来先就这个代码做几个实验,把要删除的元素的索引号依次从1到5都试一遍,发现,除了删除4之外,删除其他元素都会抛异常。

1.6K30

遍历ArrayList,并删除某些元素的方法实现「建议收藏」

题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。...因为ArrayList底层的数据结构是数组, 对于数组的特性,我们都知道, 如果删除其中某个元素的话,那么该元素后面的所有元素都会前移一个位置,结合这个特性,回到刚才的for循环中,就能很好的解释为什么漏删一条...= 0 ; i--){ if(aList.get(i).equals("abc")){ aList.remove(i); } } 而迭代器不会有这样的问题是因为...为了避免此类问题的出现,尽量还是用迭代器比较好。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除

39420

ArrayList

您说它的底层实现是数组,但是数组的大小是定长的,如果我们不断的往里面添加数据的话,不会有问题吗? ArrayList可以通过构造方法在初始化的时候指定底层数组的大小。...我问你个真实的场景,这个问题很少人知道,你可要好好回答哟! ArrayList(int initialCapacity)会不会初始化数组大小? 这是什么问题?...再结合源码,大家仔细品读一下,这是Java Bug里面的一个经典问题了,还是很有意思的,大家平时可能也不会注意这个点。 ? ArrayList插入删除一定慢么?...取决于你删除的元素离数组末端有多远,ArrayList拿来作为堆栈来用还是挺合适的,push和pop操作完全不涉及数据移动操作。 那他的删除怎么实现的呢?...index5的位置就成功被”删除“了其实就是被覆盖了,给了你被删除的感觉。 同理他的效率也低,因为数组如果很大的话,一样需要复制和移动的位置就大了。 ArrayList是线程安全的么?

72120

ArrayList源码和多线程安全问题分析

1.ArrayList源码和多线程安全问题分析 在分析ArrayList线程安全问题之前,我们线对此类的源码进行分析,找出可能出现线程安全问题的地方,然后代码进行验证和分析。...class access 在ArrayList中此数组即是共享资源,当多线程对此数据进行操作的时候如果不进行同步控制,即有可能会出现线程安全问题。...下面使用代码进行验证此问题。...1.5 代码验证数组容量检测的并发问题 使用如下代码: private static List list = new ArrayList(3); private static ExecutorService...中其他方法说明 ArrayList中其他包含对共享变量操作的方法同样会有并发安全问题,只需要按照以上的分析方法分析即可。

89540

ArrayList的contains()方法的性能问题及优化方法

背景 今天定位一个接口耗时问题,通过日志定位到在数据库查询完毕后,中间一段逻辑耗时很长有十几秒的样子,发现是循环中使用ArraysList中的contains方法,当循环数量级变得很大时,执行时间变得不可控...原理说明 1.1 ArrayList ArrayList中contains()方法的实现过程: contains()方法调用了indexOf()方法,indexOf()具体实现如下。...1.2 HashSet 既然ArrayList的contains()方法存在性能问题,那么就应该寻找改进的办法。这里推荐使用HashSet来代替ArrayList。...这种实现方式效率将比ArrayList的实现方法效率高非常多。 2....实例验证 2.1 测试ArrayList public static void main(String[] args) { ArrayList arrayList = new ArrayList

13760
领券