特点:
List集合类中元素有序,且可重复
我们通常把List及其实现类看做是对原来的数组的升级版,通常叫做"动态数组",不用关心长度够不够的问题,但不意味着它不需要扩容,只是这件事它的底层帮我们做好了
常用实现类: ArrayList,LinkedList和Vector
ArrayList,LinkedList和Vector的异同:
同:
1)这三个类都实现了接口List
2)存储的数据都具有有序,可重复的特点
说明: 涉及到底层存储有两个最基本的比较经典的数据结构:数组和链表
不同点:
ArrayList:作为List接口的主要实现类(也就是说如果没有特殊的需求,new这个就完了),线程不安全,效率高,底层使用Object[] elementData存储数据
LinkedList:每个元素叫一个Node,Node是节点的意思,对于频繁的插入,删除操作使用此类的效率比ArrayList高,因为底层使用双向链表存储数据,每一个节点中有三个部分,其中一个是节点的核心数据,另外的两个分别说明它的上一个和下一个节点是谁,如果是第一个元素,因为没有前面的节点,所以表明前一个的东西就是null。插入和删除数据只要改变指针的指向即可,改变只和他相邻的两个元素有关,因为ArrayList底层用的仍然是数组,只是说把一些操作给封装好了,所以插入,删除仍涉及到大量数据的移动,效率很低。如果只是往里面放数据(往末尾放,往中间放数据是插入),取出数据,查找数据(如果是链表查找需要一个一个找,不能直接取出来,因为链表没有序号)ArrayList效率更高
Vector:作为List接口的古老(因为最开始的版本就有了)实现类,是不怎么使用的,线程安全,效率低,底层使用Object[] elementData存储
注意:
1)String,StringBuffer底层是用char[]
2)使用链表存储和使用数组存储表现出来的特点不同
ArrayList的源码分析:
JDK7和JDK8略有不同
JDK7情况下
ArrayList list=new ArrayList();//调用空参构造器,创建了一个初始容量为10的Object类型的数组,数组名为elementData
list.add(123);//elementData[0]=new Integer(123);
……
list.add(11);//如果此次添加底层elementData数组容量不够,则扩容
默认情况下容量扩容为原来容量的1.5倍(新造了一个数组,是原来长度的1.5倍)将原来的数组中的数据拷贝到新数组中,新数组作为elementData的新值
扩容操作:elementData=Arrays.copyOf(elementData,newCapacity);
结论: 建议开发中使用带参的构造器,避免在中间环节扩容,参数决定了底层创建数组的长度,比如说知道会放不超过50个数据,那就传50即可,尽量不要用空参的构造器
说明: StringBuffer,去new的时候,如果使用空参构造器,底层造了一个长度为16的char[]数组,默认情况下容量扩容为原来的2倍再加上2
JDK8当中:
ArrayList的变化:
不会像JDK7那样在造对象的时候就把底层数组给实例化了
第一次调add方法时才把数组创建好
ArrayList list=new ArrayList();//底层Object[] elemtneData初始化为{},并没有创建长度为10的数组
list.add(123)//第一次调用add时,底层才创建长度为10的数组,并将数据添加到elementData[0]
后续的添加扩容操作与JDK7无异
小结:JDK7中的ArrayList的对象的创建类似于单例模式的饿汉式,而JDK8中的ArrayList的对象的创建类似于单例模式的懒汉式,延迟了数组的创建,节省内存
LinkedList的源码分析
在JDK7和JDK8中没什么区别
LinkedList list=new LinkedList()
内部声明了Node类型的frist和last属性,默认值为null
头指针(指向当前链表的第一个元素)用frist表示,尾指针用last表示
每一个节点中也有指针,指向前面的那个叫prev,指向后面的那个指针叫next,还包括核心数据element
list.add(123);//将123封装到Node中,创建了Node对象
其中Node定义为,体现了双向链表
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev,E element,Node<E> next){
this.item=element;
this.next=next;
this.prev=prev;
}
}
只有数组才涉及到扩容
2757

被折叠的 条评论
为什么被折叠?



