ArrayList

    vector
    复合操作需要自己保证线程安全
    Collections.synchronizedList() 这个也是吧Collection中的方法都加了一把锁,和vector差不多

    LinkedList
    继承了AbstractSequentialList:按次序遍历

    结构:
    int size=0;
    Node first; 第一个元素
    Node last; 最后一个元素
    Node内部类结构
    E item; 数据
    Node next; 下一个
    Node prev;上一个
    这里可以看出LinkedList内部维护的是一个双向链表

    其中每一个元素都会创建一个node节点并且把上一个next节点指向行的node,prev属性再初始化的时候通过构造的方式传入
    image.png
    get(int index)的时候用的二分查找
    image.png

    因为是链表所以再删除和指定位置新增的时候效率比较高,删除元素的时候也只需要验证下标接着吧元素出队

    linkedList实现了Deque接口是一个双端队列(两边都可以进两边都可以出),linkedList不仅仅是实现了队列(FIFO)还可以当做栈来使用(LIFO)
    poll();出栈
    push(E e) 入栈
    peek() 从头部查找

    coryonWriteArrayList(线程安全,但是适合读多写少,因为复制需要内存)
    复合操作需要自己保证线程安全
    写时复制:写操作的时候先把List复制一份去做写操作,这个时候做读操作读的就是老的list,写操作完再赋值回去
    使用ReetrantLook锁
    中间插入元素的时候使用分段拷贝

    addIfAbsent:添加一个不存在的元素,存在就不添加
    多线程下会导致数据不一致的情况,set的时候会copy一个数组,但是旧的数组不会删除,这个时间一个线程调用get那么访问的就是旧的数组,他是弱一致性

    迭代器
    Iterator(普通迭代器)
    1.只能读和删除
    2.从前往后遍历
    ListIterator(扩展了Iterator)
    1.从后往前遍历
    2.修改元素提供了set和add方法
    3.从指定位置开始遍历

    LinkedList中默认使用的是ListIterator,在便利的时候如果用for(i=0;i>=10;i++)get(i)这种方式会严重的影响性能,因为链表中没有下标的概念,每次get(i) 都是一次随机访问都要遍历一遍列表,推荐使用Iterator

    为什么再使用Iterator的是不能对集合做操作,因为再集合的父类中有一个modCount的一个属性,每次操作(add,set,rm)都会+1,在初始化迭代器的时候会吧modCount赋值给迭代器中的 expectedModCount在每次遍历前都会验证modCount == expectedModCount ,false就会抛出异常
    image.png
    image.png

    Map