LinkedList,Vector,ArrayList,CopyOnWriteArrayList源码简单分析

    我们经常听说LinkedList、vector、ArrayList以及CopyOnWriteArrayList,就以add为例(我写的仅仅是记录,之后会继续研究,希望大佬们多多提建议)

    1、LinkedList:

        

        你会发现其中调用了linkLast()这个方法,在查看的时候,其中的方法应该是可以看懂的吧(有可能不正确,仅供参考使用哦),指针指向的是数据地址

            

        这样的话数据就会被添加到list中,结构就是下面图片中显示的那样,它只记录的相邻的两个数据的上下数据节点,而且因为是一个环链,所以最后一条数据会与第一条数据相互记录

            

        但是当你选择添加数据的位置时,调用了linkBefore这个方法,可以看到,其中更改的也是指针指向

            

    2、Vector

               

        

        Vector会默认赋予长度为10的空间,当空间不够数据存储时,如果没有指定新增空间大小,那么会以两倍的方式增长

        

        注:vector是用synchronized来修饰方法的

    3、ArrayList:

        这个其实与Vector 一样,只不过Vector是线程安全的而ArrayList是线程不安全的,而且ArrayList在扩容的时候扩容因子是1.5,所以在执行效率上,ArrayList是比Vector快不少的

            

            

            上面的minCapacity有可能是用户自己输入的初始容量

            

            在这与Vector不一样的是,ArrayList的扩容是 1.5n + 1,而且如果使用的是无参构造函数,那么ArrayList是不会开辟默认空间的

            

    4、CopyOnWriteArrayList:

        

       从上图可以看出CopyOnWriteArrayList使用了锁,并且会在下图的方法中,进行两次复制,将修改过后的值返回,如果在返回之前读取该数据,那么读取到的数据将会是旧数据

        

        注:CopyOnWriteArrayList是用ReentrantLock来加锁的

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值