java.util.ArrayList及LinkedList的底层实现原理

常用集合类的继承结构如下:
Collection<–List<–Vector 底层是数组
Collection<–List<–Vector <–Stack(就是调用vector的方法,线程安全)
Collection<–List<–ArrayList 底层是数组
Collection<–List<–LinkedList 底层有node类存储了父节点和子节点
Collection<–Set<–HashSet 底层是HashMap,只使用key
Collection<–Set<–HashSet<–LinkedHashSet
Collection<–Set<–SortedSet<–TreeSet
Map<–SortedMap<–TreeMap
Map<–HashMap
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
Vector是线程同步的(sychronized)的,这也是Vector和ArrayList(不同步) 的一个的重要区别。
ArrayList底层基于Object类型的数组实现,初始大小为10.使用modCount实现快速失败,非同步。
在这里插入图片描述
ArrayList如果构造函数不传入初始大小,则object类型数组先赋值为一个空数组,在add方法时才真正构造(使用Arrays.copyOf方法)。如果传入初始大小,则直接new初始大小的数组。
ArrayList删除,使用system.arraycopy,把原数组index+1往后的数据,复制到原数组从开始index的位置,并把最后一个元素赋为null。
自己实现arraylist,泛型类,需要一个ensureSize函数判断数组容量是否够(每次扩容1.5倍)。
在这里插入图片描述
在这里插入图片描述
扩容,a原始容量为10,copyOf函数后为20。
LinkedList是双向链表,node节点里有next和prev指针以及自身的值,在LinkedList中有First和Last两个节点,用于指向链表的头和尾,如果调用add()方法,直接在Last节点后面添加,并把Last赋为新加的结点。
在之前版本的jdk中,只有一个header指针,header的next即为头节点,header的prev即为尾节点,header本身值为空。环形的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值