ArrayList
1. 基本特点
-
基于动态数组实现,支持随机访问。
-
顺序容器,数据存放顺序和存入顺序相同。
-
因为Java的泛型为编译器支持的语法糖,所以该数组为Object数组,支持所有类型的对象。(其他类型对象数据进入后,源码中构造方法使用toArray()转化为Obeject类型数组。)
-
因为追求速度,未实现同步,不支持多线程并发访问,可使用线程安全的vector
2. 相关方法
-
size(),isEmpty(),get(),set()均为O(1)
-
add()方法开销与数据插入位置成正比
-
addAll()方法开销与插入数量成正比
3. 自动扩容特性
-
使用 ensureCapacity()方法
-
将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。
-
对象能否被GC的依据是是否还有引用指向它或对应的位置被其他元素覆盖,所以数组最后一个位置必须显式赋为null,,否则原来的对象就一直不会被回收
LinkedList
1. 基本特性
-
基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素,首段或者末尾删除元素只需要O(1) 。
-
LinkedList 还可以用作栈、队列和双向队列。
-
未实现同步,不支持多线程并发访问,非线程安全,可以使用 Collections.synchronizedList() 方法对其进行包装。
2. 方法实现
-
内部两个指针first和last,分别指向链表内第一个和最后一个节点元素。
-
clear()方法,为了指针GC更快可以回收放置的元素,需要将要回收的节点之间的引用关系赋空。