LinkedList Vector基本源码分析

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

其他源码自己分析吧,没什么难的,就是双链表的增删改查获得元素数啥的。
曾经很少分析源码,主要源于恐惧,看见源码这么长就头大。但是只要一步一步分析,认真去看,多看几遍,收获还是非常大的。不仅让你会用,还能让你知道原理。不禁让我想起了学长的一句话:源码面前,没有秘密

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值