ArrayList LinkedList vector的区别
ArrayList():List主要实现类,效率高,线程不安全
特别注意:ArrayList在实际开发中建议,使用带参数的构造器,指明底层数组的长度,避免不必要的扩容
ArrayList和vector底层都是使用数组实现
源码分析:
jdk7: List list =new ArrayList(); //elementData =new Object[10];
list.add(1); //elementData[0]=1;
............
当我们添加第11个元素时,需要考虑扩容:扩容为原来的1.5倍,同时需要将原有的数组的数据拷贝到新的数组
总结:ArrayList在jdk7中的创建和添加时,类似于饿汉模式,在创建ArrayList时创建长度为10的数组,再添加元素时,考虑扩容为 1.5倍
jdk8: List list =new ArrayList(); //elementData ={};
list.add(1); //此时才创建了长度为10的Object数组,同时将元素添加到索引为0的数组位置
............
当我们添加第11个元素时,需要考虑扩容:扩容为原来的1.5倍,同时需要将原有的数组的数据拷贝到新的数组
总结:ArrayList在jdk8中的创建和添加时,类似于懒汉模式,在第一次添加元素时,才创建长度为10的数组,当扩容时,考虑扩容 为1.5倍
LinkedList:双向链表结构,对于频繁的删除插入操作使用
LinkedList的双链表结构:
源码中存在Node结构他其中有三个属性(next--->上一个, E---->当前位置本身, prev--->下个)
在添加元素时星进入的元素中的next指向上一个元素的E,新添加元素的prev指向下一个元素的E,方构成双向链表
Vector:古老实现类,效率低,线程安全
jdk7,jdk8: List list =new Vector():两版本的底层都是先创建了长度为10的数组
总结:Vector较为古老,两个版本的扩容都为原来的2倍