List接口
list接口:存储有序的、可重复的数据。 ------>“动态数组”,替换原有的数组
ArrayList、LinkedList、Vector三个类异同:
- 同:
- 三个类都实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
- 不同:
- ArrayList:作为List接口的主要实现类;线程不安全,效率高,底层使用Object类型数组存储
- Vector:作为List接口的古老实现类;线程安全,效率低,底层使用Object类型数组存储
- LinkedList:对于频繁插入和删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
1. ArrayList
-
JDK7️⃣:
- 底层创建了一个长度是10的Object【】数组elementData
- 在长度超过10之后,长度会默认扩容为原来的1.5倍(一般情况),如果还是不够,干脆就扩容成你的大小,甚至超过整型最大值就报错
- 最后再将原来的数组复制到新的数组中
- 结论:建议开发中去使用带参构造器以便效率高:Arraylist arraylist = new Arraylist(int capacity)
-
JDK8️⃣:
- 底层有数组elementData,但是没有实例化
- 在添加的时候,会首先判断是否为初始化条件下,如果是就直接长度为10和你增加的长度的最大值
- 后序的添加和扩容与jdk7️⃣无异
-
小结:
- JDK7️⃣的Arraylist创建类似于单例模式的饿汉式
- JDK8️⃣的Arraylist创建类似于单例模式的懒汉式,延迟了数组的创建,节省内存
2. LinkedList
-
内部声明了Node类型的first和last
-
其中,Node定义中有一个next和pre,体现了LinkedList的双向链表的说法,不涉及扩容
3. Vector
- 扩容的时候是2倍