ArrayList下的clear 和 removeAll
来源:互联网 发布:超星尔雅网络课程破解 编辑:程序博客网 时间:2024/06/06 20:26
最近 做天气项目时,要用到了 ArrayList的重用,对于最低最高温度的存储和比较,因为没有考虑到List重置,也是经过了一番Debug,下面总结下,让自己也长长记性:
这个方法会检查迭代器顺序返回的每个元素是否包含在特定的集合中。如果存在,调用迭代器的remove方法将它从集合中移除。因为会用到contains方法,removeAll的复杂度是O(n^2)。所以在想要重置一个大的ArrayList时,这种方法是绝对不可取的。下面我们比较一下两者在重置一个包含100K个元素时的性能差异。
很多时候为了重用我们会想要重置一个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()源码:
public void clear() { modCount++; // clear to let GC do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; }
Remove()源码:
public boolean removeAll(Collection<?> c) { //判断对象是否为null Objects.requireNonNull(c); boolean modified = false; Iterator<?> it = iterator(); while (it.hasNext()) { if (c.contains(it.next())) { it.remove(); modified = true; } } return modified; }
这个方法会检查迭代器顺序返回的每个元素是否包含在特定的集合中。如果存在,调用迭代器的remove方法将它从集合中移除。因为会用到contains方法,removeAll的复杂度是O(n^2)。所以在想要重置一个大的ArrayList时,这种方法是绝对不可取的。下面我们比较一下两者在重置一个包含100K个元素时的性能差异。
当使用clear()方法也消耗很长的时间时,考虑创建一个新的列表,因为java可以很快的创建一个新的对象。
阅读全文
0 0
- ArrayList下的clear 和 removeAll
- mybatis中使用List时应注意removeAll(),clear()和new ArrayList()的区别
- 如何重置一个ArrayList--clear vs removeAll
- List的clear()方法和removeAll()方法 的区别
- Java中ArrayList 的remove&removeall
- 关于Session方法之Abandon、Clear和RemoveAll
- 关于Session方法之Abandon、Clear和RemoveAll
- 关于Session方法之Abandon、Clear和RemoveAll
- List的Clear方法与RemoveAll方法用法小结
- Session方法Clear、RemoveAll、Abandon的联系与区别之我见
- Session中remove()、removeAll()、clear()、Abandon()区别
- ArrayList的方法:remove(object o) 、remove(int index)、removeAll(Collection c)时间复杂度的比较
- 集合操作retainAll和removeAll
- DataTable.Clear() 和 DataTable.Table.Rows.Clear() 的区别
- 【clear】闭合浮动(clear)的原理和应用
- List的removeAll方法异常?
- [C#]list的removeall用法
- 获取两个List中重复或不同的元素---removeAll()和addAll()的使用
- 时间date
- Tutk P2P的原理和常见的实现方式
- js调用exe可执行文件(IE8)
- python
- java 下载文件名乱码问题
- ArrayList下的clear 和 removeAll
- 九九乘法表
- 堪称最好最全的A*算法详解(译文)
- Android开发模板------ViewPager(三):实现无限循环、可嵌套RecyclerView、可控制滑动速度
- 线性渐变
- 调试
- ggplot2-分面(facet) 一页多图(转载)
- 将jar打入本地仓库
- Python2.7 hmac.py TypeError: character mapping must return integer, None or unicode"