1.List集合的三个子类
这是众所周知的:
-
ArrayList
-
底层数据结构是数组。线程不安全
-
-
LinkedList
-
底层数据结构是链表。线程不安全
-
-
Vector
-
底层数据结构是数组。线程安全
-
看看ArrayList的JDK源码:
1.ArrayList的构造方法:
2.Add方法:
动态扩容:
还有其他的add方法,get方法,remove()方法等等。
与扩容相关的基本上都是调用System.arraycopy()的arraycopy()方法,这是一个本地方法;
ArrayList是基于动态数组实现的,在增删时候,需要数组的拷贝复制。
删除元素时不会减少容量,若希望减少容量则调用trimToSize()
它不是线程安全的。它能存放null值
问题:如果想要保证List集合的线程安全,又不想用老旧的Vector,怎么办呢?有其他的办法吗?
答案是使用可以使用Collections的方法:List list = Collections.synchronizedList(new ArrayList(...));
,就可以实现同步了
Vector和ArrayList还有一个区别就是Vector的扩容是扩为原来的额两倍。这也就是为什么Vector不用的原因,因为其同步,所以有性能的损失,再者因为其按百分之一百的比率增长,浪费内存。
ArrayList还有两个重要的API:
ensureCapacity(): 如果已经清楚数组能够存储数据的容量,就可以再填充数据前调用这个方法。
trimToSize(): 将存储区域的大小调整为当前元素数据量所需要的储存空间数目,垃圾回收器将回收多余的储存空间。
一个既能灵活扩充数组又能访问数组元素的技巧:
LinkedList解析:LinkedList底层是双向链表 主要方便实现往前遍历
1.源码
构造方法:两个
1.add方法:
总的来说:查询多用ArrayList,增删多用LinkedList。