基于jdk1.8
ArrayList
如图,ArrayList内部由线性结构数组实现,内部实现数组的动态增长—>源码详解
知识总结:
- ArrayList内部使用一个数组存储数据,使用一个size变量标记储存了多少个元素。
- 数组初始化最小长度为10(为节约空间,ArrayList引入了空数组),支持最大元素为Integer.MAX_VALUE - 8,减8是因为部分JVM创建数组时额外需要8位存储数组长度,当然你可以预定义Integer.MAX_VALUE的大小,但要保障JVM安全。
- 它可以存储任一对象,包括null,当向其中添加元素时,会进行动态扩容操作,每次扩容增加的大小为oldCapacity + (oldCapacity >> 1),也就是原来的1.5倍。所以最好使用之前能够估计好元素的数量。
- 数组结构保障了ArrayList随机访问能力强,在查找元素,末尾插入\删除元素很快,指定位置插入元素\删除元素需要移动数组。 所以查找操作多推荐使用ArrayList,删除操作多时推荐使用LinkedList。
- 继承AccessRandom标记接口,标记for循环遍历元素要快于iterator迭代遍历。
- ArrayList非线程安全集合,可通过Collections.synchronizedList()变成线程安全或使用CopyOnWriteArrayList。
LinkedList
如图,LinkedList内部由线性结构双向链表实现—>源码详解
知识点:
- 链表结构,保障了LinkedList在指定位置删除/插入元素(包括null元素)效率会高于ArrayList,因为不需扩容所和copy元素的成本。
- 链表结构保障了LinkedList加入元素个数是无界的。
- LinkedList在查找元素时需要从first或last端(计算元素位置离first和last那个更近)开始遍历,效率一般。
- LinkedList支持双向队列Deque的支持,所以可以实现队列[FIFO]操作(boolean offer(E e):将元素追加到队列末尾,若添加成功则返回true,poll():从队首删除并返回该元素,peek():返回队首元素,但是不删除),实现栈[FILO]操作(push(E e):将给定元素”压入”栈中, pop():将栈首元素删除并返回)。
- LinkedList非线程安全集合,可通过Collections.synchronizedList()变成线程安全。
Vector & CopyOnWriteArrayList
Vector & CopyOnWriteArrayList都是List集合的线程安全版本,内部实现结构通过数组实现,Vector扩容是2倍,并且线程安全是通过synchronized同步方法实现,CopyOnWriteArrayList则是按添加/删除元素个数扩容,也就说每添加/删除一个元素便会重新长生一个新的数组,元素个数siz始终等于object[].length,其线程安全由ReentrantLock保障。
☀>.freerme[https://blog.csdn.net/freerme]