学习自:
http://www.cnblogs.com/skywang12345/p/3308556.html
removeAll
和retainAll()
看这里https://lizhongzhen11.github.io/2018/03/20/thinkingInJava/#1571
问题及注意点
1.本文一开头给出的第一个链接里面关于容量自增讲的是 新的容量=“(原始容量x3)/2 + 1”,但阅读1.8版本的源码会发现,容量自增方式改变了。
1.8版本通过
grow()
进行容量自增。其中int newCapacity = oldCapacity + (oldCapacity >> 1)
这段代码的意思是新容量 = 旧容量的1.5倍。
研究1.6版本的应该知道,以前容量自增是int newCapacity = (oldCapacity * 3)/2 + 1
即1.5倍 + 1,为何会对自增算法进行修改呢?
网上找了下,一个说法是自增算法改为位运算效率更高。至于为什么舍去了加1或许也是从效率上考虑的吧。
还有,1.6版本并没有对容量进行限制,但是1.7及以后的版本都限制了最大的容量:Integer.MAX_VALUE - 8
,防止容量越界。
2.初始容量为何是10?
暂时不清楚。。。
3.ArrayList
是有序的,先进先出。同时,它也是非线程安全的。
4.ArrayList
实现了 RandomAccess
接口,支持快速随机访问,实际上就是通过下标序号进行快速访问。
5.ArrayList
和LinkedList
的对比
- 顺序插入速度
ArrayList
会比较快,因为ArrayList
是基于数组实现的,数组是事先new
好的,只要往指定位置塞一个数据就好了;LinkedList
则不同,每次顺序插入的时候LinkedList
将new
一个对象出来,如果对象比较大,那么new
的时间势必会长一点,再加上一些引用赋值的操作,所以顺序插入LinkedList
必然慢于ArrayList
。 - 基于上一点,因为
LinkedList
里面不仅维护了待插入的元素,还维护了Entry
的前置Entry和后继Entry,如果一个LinkedLis
t中的Entry
非常多,那么LinkedList
将比ArrayList
更耗费一些内存。 - 使用各自遍历效率最高的方式,
ArrayList
的遍历效率会比LinkedList
的遍历效率高一些。 - 有些说法认为
LinkedList
做插入和删除更快,这种说法其实是不准确的:
1)LinkedList
做插入、删除的时候,慢在寻址,快在只需要改变前后Entry
的引用地址
2)ArrayList
做插入、删除的时候,慢在数组元素的批量copy
,快在寻址