1>Arraylist底层实现原理
a:底层是基于动态数组实现,采用顺序存储结构,基于顺序的存储结构,内存空间是连续的,支持高效的随机访问数据,查询数据的时间复杂的为O(1),插入数据的时间复杂的为O(n),
b:默认创建的长度为10,在进行扩容的时,会创建一个是之前数组容量的1.5倍的数组,会将原始的数组中的数据拷贝到新的的数组当中
c:Arrayllist的add方法,在每次添加元素的时候都会进行一个判断,判断该数组是否需要扩容,在指定的index中插入数据的时候,需要判断该index是否越界
线程不安全的理由,在多线程访问Arraylist,如果其中的一个线程,对该数组的结构进行了修改此实现实现的不同步的,其他线程继续访问该数组抛出异常.
线程不同步的的一个重要原因,是Arraylist方法中,都,没有被synchronized同步方法修饰
2>Likedlist的底层实现原理
a:底层的数据结构使用的是双向链表,对linkedlist的操作实际上就是对双向链表的操作
b:Linkedlist中的每一个元素都对应双向链表的的一个节点,包括3个部分,一个是对前节点的引用,一个是数据本身,一个是对后节点的引用
c:基于双向链表的顺序访问数据,效率较高,随机访问效率低下
d:在增加,和删除的操作中,时间复杂度为O(1),只需要改变指针的指向即可
e:支持的遍历操作,通过iterator迭代效率高,通过随机访问get()访问效率低
3>Vector的底层实现原理:
该底层和Arraylist的底层实现一样,只是Vector是线程安全的,方法都被synchronized同步,扩容后是原来的2倍
总结:以上3中集合的区别:
1>vector和Arraylist底层都采用的是数据这种数据结构,是顺序存储,存储空间连续,Linkedlis底层是链表这种数据结构
2>线程安全:vector线程安全,Arraylist和Linkedlist线程不安全
3>基于效率问题,基于数组顺序存储结构,随机访问数据效率高,基于链表这种数据结构,增加删除效率高,但是基于链表这种数据结构需要更多的内存空间,才赢空间换时间的思想
4>就扩容而言,Arrylist是之前的1.5倍,Vector是原来的2倍