Collection和Collections
- Collection 是一个接口 集合类需要实现的接口
- Collection 是一个工具类包含很多集合操作的静态方法
List和Set都是接口
- List 集合元素有序,可重复
- Set 集合元素无序,不可以重复
ArrayList,LinkedList,Vertor都实现 List接口
- LinkedList类是一个双链表实现了 Deque<E>接口,添加删除元素的性能优于ArrayList,get,set性能不如ArrayList
- ArrayList在数组结尾增加一个元素的开销和LinkedList是一样的, 但是在数组中间加入一项有可能会造成数组重新分配,性能开销巨大。ArrayList列表中删除一个元素列表会移动,LinkedList则不会
- Vector比ArrayList在多线程下更为可靠,ArrayList比Vector在单线程下存储性能更优越。
SynchronizedList和Vector又有和区别
- SynchronizedList使用同步代码块,Vector使用方法同步,
- 同步范围大小与性能成反比。
- 同步代码块可以控制锁的作用域,同步方法的作用域是整个方法
- 静态代码块可以选择加锁对象, 静态方法只能对this加锁
- SynchronizedList并未对listIterator和listIterator(int index)做同步处理,但是Vector却做了,所以在迭代时SynchronizedList需要手动加锁
- 但是ArrayList和LinkedList可以转换成SynchronizedList变为线程安全的List
fail-fast与fail-fast
- java.util 下所有集合fail-fast机制 非并发情景下使用
- java.util.concurrent. 下所有集合fail-saft机制 并发情境下使用
- ConcurrentModificationException 错误处理 使用CopyOnWriteArrayList 替代ArrayList
CopyOnWriteArrayList对 Add/Remove 加锁 对读不加锁 是读写分离的。读出数据可能不准,Vector读写互斥同时只能做一个处理读出数据准确
删除集合元素的几种方法
- 1. 使用for循环,不推荐
- 2. 使用Iterator的remove方法
1 2 3 4
| Iterator iterator = list.iterator(); while(iterator.hasNext()){ iterator.remove(); }
|
- 3. 使用filter过滤(JDK1.8)
1 2 3
| items.stream().filter( item->item.equals("xxx"); ).collect(Collectors.toList());
|
- 4. 使用增强for循环, 删除后从循环中退出 ,适用只需删除一个符合条件元素
- 5. 使用fail-saft的集合类处理