Vector
底层是对象数组
线程同步,线程安全
无参构造,默认为10,满了后,按照2倍扩容
指定大小,满了后,直接按照两倍扩容
1.无参构造的时候:
这里看到,无参构造默认空间为10
2.执行add方法的时候
这里说一下:synchronized是保证线程安全的
ensureCapacityHelper:
这个方法判断是不是要扩容;
第一次执行的时候minCapacity=1;(0+1)
3.我们看一下这个方法的源码:
elementData.length为10.(无参构造,默认为10)
1<10; 现在够用,所以不用扩容
4.当执行了10次以后(因为默认先给10个空间),就要执行扩容方法了
重点:
下面代码就是扩容的本质了;相当与
新的空间=旧的空间*2;
LnkedList
1.底层实现了双向链表和双端队列特点
2.可以添加任意元包括null
3.线程不安全,没有实现同步
底层操作机制
1.底层维护了一个双向链表
2.维护了两个属性first last分别指向首结点和尾结点
3.每个结点(Node对象)里面维护了prev、next、item三个属性
4.LinkedList添加删除快,不是通过数组完成的,相对来说效率高
LinkedList<Object> l = new LinkedList<>();
l.add(1);
l.add(2);
System.out.println(l);
1.无参构造
linkList的属性first=null,last=null
2.add(1)的时候
执行linkLast(e)
将e插入链表尾部
4.执行add(2)
将2插入了尾部
ArrayList和LinkedList的选择
ArrayList: 改查多
LinkedList:增删多
一般来说,很多都是查询,因此,大部分都是ArrayList
其他源码自己分析吧,没什么难的,就是双链表的增删改查获得元素数啥的。
曾经很少分析源码,主要源于恐惧,看见源码这么长就头大。但是只要一步一步分析,认真去看,多看几遍,收获还是非常大的。不仅让你会用,还能让你知道原理。不禁让我想起了学长的一句话:源码面前,没有秘密