乐趣区

关于spring:ArrayList与LinkedList

ArrayList 与 LinkedList

ArrayList是线程不平安的

public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

察看 add 办法能够看出当在多线程的状况下,insert modCount 的办法是可能存在线程抵触的。

为什么 ArrayList 还要实现 RandomAccess 接口?

RandomAccess 接口实际上就是一个标识,它代表着 ArrayList 是反对快速访问性能的

  • 实现 RandomAccess 的 list 优先用 for 循环 其次是 foreach
  • 未实现的话 优先 iterator 遍历(foreach 底层也是这个实现的)大 size 不能够 for 循环

arrayList的底层实现是 Object 数组,所以 add(E e)办法的工夫复杂度是 O(1)

如果是 add(int index, E e)工夫复杂度就是 O(n – i),因为要把前面的元素往后移一位

因为是数组实现的 所以 ArrayList 反对快速访问 get(int index)

ArrayListVector 相比,Vector 是线程平安的 然而同样也导致线程拜访 Vector 会在同步上破费大量工夫

ArrayList 对应的就是LinkedList

LinkedList 同样是线程不平安的

public boolean add(E e) {linkLast(e);
        return true;
    }

看源码可知,这里没有对多线程做任何预防

LinkedList 的底层是双向链表实现的,所以新增删除的工夫复杂度是 O(1), 而带 index 的新增则为 O(n), 因为要挪动到这个地位,

LinkedList 是不反对快速访问的,链表嘛

和 ArrayList 不一样,数组实现的话须要预留很多多余的空间,然而链表除了自身的大小其余没有多余空间节约

本文由博客一文多发平台 OpenWrite 公布!

退出移动版