java基础-集合使用中的各类问题

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的集合类处理