当前位置:   article > 正文

Java ArrayList,LinkedList,Vector_javaarraylist和linkedlist和vector

javaarraylist和linkedlist和vector

一.ArrayList

1.继承关系

在这里插入图片描述

2.底层实现

低层由object数组实现,但是这个数组是动态的
在这里插入图片描述

3.ArryList扩容

在这里插入图片描述
modCount++(在迭代的过程中或者)是用于在多线程环境检测结构是否发生变化的,变了会抛出ConcurrentModificationException异常
插入元素时,先检测长度是否等于elementData数组的长度,等于就调用grow()
在这里插入图片描述
minCapacity(最小扩容后容量)这里新增一个所以要加一
Arrays.copyOf将原来的数组拷贝给扩容后的新数组,底层使用的是System.arraycopy
调用newCapacity获取扩容后的新容量
在这里插入图片描述
oldCapacity为没扩容时的容量
newCapacity为新容量,大小为oldCapacity+1.5倍左右的oldCapacity(>>向右移一位,位运算效率高)
如果newCapacity比minCapacity(最小扩容量)小,直接返回minCapacity(即扩容后为minCapacity大小)
并且如果elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA(即默认的空数组),就取与DEFAULT_CAPACITY(默认容量)中大的那个返回
minCapacity<0不知道为啥,之前if -minCapacity为负不久不能进了,还是说newCapacity和minCapacity都能为负数,直接就oom了
如果newCapacity比minCapacity大,判断newCapacity和MAX_ARRAY_SIZE[=Integer.MAX_VALUE - 8(这个减8是为了容错性)],小于返回newCapacity,如果比MAX_ARRAY_SIZE都大则调用
hugeCapacity
在这里插入图片描述
newCapacity没法扩这么大,只能扩minCapacity这个大小了
判断minCapacity和MAX_ARRAY_SIZE,如果还是比MAX_ARRAY_SIZE大,直接返回Integer的最大值(都给你吧QAQ),没有MAX_ARRAY_SIZE就返回MAX_ARRAY_SIZE
Q1:为啥容1.5倍左右
在这里插入图片描述
来源
1.k=1.5时,就能充分利用前面已经释放的空间。如果k >= 2,新容量刚刚好永远大于过去所有废弃的数组容量
2.>>1刚好是1.5倍左右,方便
Q2:ensureCapacity
当插入大量数据时,使用ensureCapacity预先设置扩容大小,可以提高效率,减少扩容消耗的时间

二.LinkedList

1.继承关系

在这里插入图片描述

2.底层实现

在这里插入图片描述
双向链表实现
在这里插入图片描述
每一个node节点都是一个对象,包含一个prev(前)指针,next(后)指针,数据区

三.Vector

1.继承关系

在这里插入图片描述

2.低层实现

在这里插入图片描述
数组,类似arrylist,但是方法有synchroniz修饰

四.比较

1.ArrayList与LinkedList

ArrayList由动态数组实现(数组存放在内存整块),适合下标访问(快速随机访问),查询快;不保证线程安全
时间消耗在:新增时如果在中间位置插入,后面的数组下标需要改变;扩容
如果对arraylist指定合适的初始容量,采用尾插法新增数据可以大幅提升性能
LinkedList由双向链表实现(链表每块位于随机位置),适合插入和删除;不保证线程安全
在插入大量对象时,会创建大量node节点,效率会降低
使用Iterator遍历,如果使用for循环遍历性能低(for循环由下标访问)
在linkedlist使用indexOf会遍历链表,效率低

2. ArrayList和Vector

ArrayList 是 List 的主要实现类,适用于频繁的查找工作,线程不安全
Vector 是 List 的古老实现类,线程安全的

基于jdk12,不同版本有细微不同

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/322050
推荐阅读
相关标签
  

闽ICP备14008679号