List集合类介绍(源码剖析)

1、前言

基于JDK1.8源码解析List集合类下的ArrayList,Vector与ArrayList的区别,LinkedList。

要点总结

  • ArrayList底层是数组,初始容量默认为10,每次扩容为原容量的1.5倍;
  • ArrayList基于动态数组实现,扩容的底层通过JNI调用JVM里由C/C++编写的native方法实现,可概括为申请一块新的内存存放新数组,再把原数组的数据拷贝到新内存中;
  • ArrayList非线程安全,能存放null;
  • 删除元素是不会减少容量,减少容量要调用trimToSize();
  • Vector线程安全,增删操作都用synchronized实现同步,但是效率有损失,已经过时,可以用CopyOnWriteArrayList或者用Collections的方法包装ArrayList(例:List l = Collections.synchronizedList(new Array List<>());)。Vector初始容量为10,每次以一倍的比率扩容,扩容的底层实现与ArrayList相同;
  • LinkedList的底层是一个双向链表,增删在大部分情况下优于ArrayList(不是绝对,例如一直在末尾增删,ArrayList不需要移动数组,而LinkedList需要遍历到链表尾部),查询在大部分情况下不如ArrayList(不是绝对,例如查询的是首个元素);

2、ArrayList解析

List集合类介绍(源码剖析)

3、ArrayList与Vector的区别

4、LinkedList解析

List集合类介绍(源码剖析)

5、总结

参考资料

  • JDK1.8源码