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解析
3、ArrayList与Vector的区别
4、LinkedList解析
5、总结
参考资料
- JDK1.8源码