集合(谈谈Collection下的List)

1.关于List

它是可以储存有序且可以重复的集合,是一个接口,它无法实例化自己。

2.关于ArrayList

1.它的数据结构为数组,数组 又是基于(索引)的数据结构,所以它使用索引进行查询和搜索是非常快的。

2.它进行插入或者删除数据的时候是非常满的,因为每删除或者插入一个元素,插入元素的后面元素都要整体的往后移。(个人理解:其实就相当于固定个100个重量物品,你往中间插一个物品,然后把它后面的元素都往后移,你感觉累不累,所以就速度慢)

3.他在多线程下是不安全的,因为其底层实现方式没有同步

源码分析


    //默认初始容量为10
    private static final int DEFAULT_CAPACITY = 10;

   //存储ArrayList元素的数组缓冲区 
    transient Object[] elementData; // non-private to simplify nested class access

   //ArrayList的大小(它包含的元素数) 每添加一个元素  size++
    private int size;

  //构造一个初始容量为10的空列表
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
// 当初始容量不够了的时候 就进行扩容  代码逻辑讲解一下
    private void grow(int minCapacity) {
        // overflow-conscious code
//这里就是先获取之前的初始容量,可能为10,也可能为100
        int oldCapacity = elementData.length; 
        //进行扩容的大小  oldCapacity >> 1 == oldCapacity * 2 +1 
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
          //把之前的元素放在新扩容的容器里面
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

3.Vertor

1.它底层数据也是通过数组实现,也是查询快,增删慢 

2.但它在多线程下是安全的,但效率低,因为其底层方法实现都是加了synchronized(同步)锁(个人理解效率低,就是因为加锁了嘛,每次访问方法的时候,需要等待上个方法完成之后释放锁,然后在进行访问。就感觉就是一个一个来执行的)

源码解析

private void ensureCapacityHelper(int minCapacity) {
        //判断当前元素数量是否满足扩容,如果满足,则扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }


    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
      //代码逻辑讲解
    private void grow(int minCapacity) {
        // 获取到当前初始容量大小
        int oldCapacity = elementData.length;
        //然后进行扩容成新的初始容量为 newCapacity = oldCapacity*2
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
              //再把之前的元素放在新的容器里面
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

4.LikedList

1.它底层的数据结构为双向链表,它的特点为查询比较慢,但增删快。

2.它在多线程下是不安全的,其方法的实现没有同步,无初始容量,因为链表是无限长的。

理解链表查询慢是因为它每次查询都要从头开始遍历(假如里面有10亿的数据,你一个个遍历,好家伙,直接累憨)增删快(你可以理解为10个小朋友手拉手,我们只需要把其中两个小朋友的手分开牵新的小朋友的手就行了)

1.真正的动态结构,添加或者插入新节点,改变上一个或者上下节点的next和perv属性就行
  内存空间不连续,也不会有扩容的情况。

2.由于没有下标,get方法实际上是先找头元素,然后循环next获取的,所以这种情况用for循环
遍历,每次都会从头开始循环,所以linkedlist最好是用迭代器遍历

3.遍历慢,删除插入快,因为内存不连续,并且不用维护下标。

5.总结 

        ArrayList底层数据结构为数组,它查询快,增删慢,在多线程下是不安全的,初始容量为10,扩容为1.5倍

        vertor 是底层数据结构为数组,它查询快,增删慢,在多线程下是安全的。

        LinkedList 是底层数据结构为双向链表,它查询慢,增删快,在多线程下是不安全的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值