很多时候为了重用我们会想要重置一个ArrayList,这里的重置是指清空列表或移除列表所有的元素。在Java中,有两个方法可以帮助我们实现重置clear
或removeAll
。在列表长度很小的情况下(eg:10或100个元素),可以放心的使用这两种方法。但如果列表很大(eg:10M个元素),那么选择clear还是removeAll会对你java应用的性能造成巨大的影响。甚至有时,在列表过大的情况下,重置会耗费许多时间,那么重新创建一个新的列表比将老的列表重置要好。但需要提醒的是,必须要确保老的列表可以被垃圾回收,否则,有很大的风险会出现java.lang.OutOfMemoryError: Java Heap Space
。言归正传,让我们看看clear()和removeAll()两个方法。大家应该常常会选择用clear(),因为他的复杂度是O(n),而相比之下,removeAll(Collection C)的性能要差一些,它的复杂度是O(n^2)。这也是为什么在重置大的列表的时候两个方法会有巨大的差异。如果阅读他们的源码并运行下面的例子程序,差异会更明显。
Clear() vs RemoveAll(Collection c)
为了更好的比较这两个方法,阅读他们源码是很重要的。可以在java.utils.ArrayList
类中找到clear()方法,不过为了方便我将它引入到了这里。下面的代码来自JDK 1.7.0_40版本。如果你想要学习更多的有关性能监控和调优的知识,我强烈建议阅读Scott Oaks
写的Java Performance the Definitive Guide
,它包含了java 7和一点java 8。下面是clear()的代码片段:
大家可以看出,clear()在循环遍历ArrayList,并且将每一个元素都置为null,使它们在没有被外部引用的情况下可以被垃圾回收。相似的,我们可以在java.util.AbstractCollection
类中查看removeAll(Collention c)的代码,下面是代码片段:
这个方法会检查迭代器顺序返回的每个元素是否包含在特定的集合中。如果存在,调用迭代器的remove方法将它从集合中移除。因为会用到contains方法,removeAll的复杂度是O(n^2)。所以在想要重置一个大的ArrayList时,这种方法是绝对不可取的。下面我们比较一下两者在重置一个包含100K个元素时的性能差异。
删除一个包含100k个元素的列表中的所有元素
我本来想在例子中尝试重置一个包含10M个元素的列表,不过在超过半个小时等待removeAll()结束后,我决定将元素的数量降为100K。在这种情况下,两个方法的差距也是很明显的。removeAll()比clear()多花费了10000倍的时间。事实上,在API中clear()和removeAll(Collection c)这两个方法的目的是不同的。clear()方法是为了通过删除所有元素而重置列表,而removeAll(Collection c)是为了从集合中删除某些存在于另一个提供的集合中的元素,并不是为了从集合中移除所有元素。所以如果你的目的是删除所有元素,用clear(),如果你的目的是删除某些存在于另一集合的元素,那么选择removeAll(Collection c)方法。
由于程序使用了两个arrayList存储Integers,所以在运行时要确保有足够的内存,尤其是你想比较在列表存有1M个元素时,两种方法的性能差异。另外,由于使用了在数字中加入下划线的特性,所以需要java7来运行。如果没有JDK7,也可以移除SIZE常量中的下划线。
以上就是关于如何重置一个ArrayList的内容。我们不仅仅学到了两种从列表中删除元素的方法,也学到了clear()和removeAll()方法的区别。我们明白了为什么在列表过大时,removeAll()性能很差。
PS:当使用clear()方法也消耗很长的时间时,考虑创建一个新的列表,因为java可以很快的创建一个新的对象。
相关推荐
主要给大家介绍了关于Java中ArrayList的removeAll方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。
ArrayList Vector LinkedList 区别与用法.
ArrayList测试.使用C#实现ArrayList的增加Add(),移动Remove(),删除delect()等功能,过程明了带有注释
C# Array和ArrayList,List区别
ArrayList、LinkedList、Vector区别简介。
要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:
ArrayList深度剖析与简单实用、 ArrayList重要的方法和属性(1)构造器 ArrayList提供了三个构造器 Count属性和Capacity属性 4、ArrayList与数组转换 Array的复杂版本 ArrayList常用方法 ArrayList同步机制 ...
ArrayList LinkList Vector的区别 java开发 集合 collection
集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试
关于arraylist和linkedList的区别
java的 ArrayList的使用与分析
主要介绍了java ArrayList.remove()的三种错误用法以及六种正确用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1,ArrayList是数组的数据结构,LinkedList是链表的数据结构。 2,随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于 3,索引(index)的数据结构,可以直接映射到。 4,插入、...
ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储...那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要...
Remove 從 ArrayList 中移除特定對象的第一個匹配項 RemoveAt 移除 ArrayList 的指定索引處的元素 Insert 將元素插入 ArrayList 的指定索引處 ArrayList arrlist = new ArrayList(); //..使用 Add方法在 ...
对数组和ArrayList的学习总结,详细介绍了数组与ArrylyList的使用
arrayList排序arrayList排序arrayList排序
在jni中操作arraylist对象,然后添加一个int型数据进去