想都不用想,removeAll是时间复杂度是O(n2)的,恐怖呀。 我也是看我们产品一个过滤消息的代码为什么执行时间这么长,我才想起的。究竟有多恐怖,给大家点直观感受,举个例子:
如果我要删掉arraylist里面的,属性b填的是“bb”的。要怎么做。
方法1:
方法2:
结果:
测试5次,第一次可能是刚启动android app,申请内存等缘故,时间特别长。哪怕把最大的两个值去掉,相差的倍数也不用我描述了吧。
方法1:1202ms 751ms 333ms 337ms 306ms
方法2: 3ms 6ms 1ms 2ms 2ms
想一想:
我之后去搜索了一下,确实有类似的文章说这个事情,文章内容也是很👍的。不过这一切没有超越我的常识,我一直也认为,java嘛,确实它的库本身的实现,在效率方面真的有待考量。例如上次被坑的string.split, 居然里面又是arraylist,又是正则的,频繁使用,也是大量gc;还有effective java推荐的stringbuilder,创建的时候不去填个长度的话,各种扩容,tostring之后各种gc,尽量不要new,把原来的delete来用吧,会好很多; 条数n多的用arraylist+范型和用数组的内存消耗也是天差地别。大家多留个心,特别是优化后期,或者性能瓶颈就在这些不起眼的地方了,也许你就是被字符串害死的。