ArrayList
vector
复合操作需要自己保证线程安全
Collections.synchronizedList() 这个也是吧Collection中的方法都加了一把锁,和vector差不多
LinkedList
继承了AbstractSequentialList:按次序遍历
结构:
int size=0;
Node
Node
Node内部类结构
E item; 数据
Node
Node
这里可以看出LinkedList内部维护的是一个双向链表
其中每一个元素都会创建一个node节点并且把上一个next节点指向行的node,prev属性再初始化的时候通过构造的方式传入
get(int index)的时候用的二分查找
因为是链表所以再删除和指定位置新增的时候效率比较高,删除元素的时候也只需要验证下标接着吧元素出队
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就会抛出异常
Map