1.List与Set的区别?用实验证明出来。
2.HashSet与TreeSet的区别?用实验证明出来。
3.ArrayList与LinkedList的区别?
4.列举几个线程安全的容器。HashMap不安全 为什么我们还常用他 如何规避安全问题
补充:普通集合的遍历删除
1.普通foreach+if做遍历删除 大概率抛出 并发修改异常
2.单线程环境下 可用Iterator迭代器做遍历删除
3.多线程环境下 安全地遍历删除 只有代码中做加锁操作才能达到
-线程安全的容器用普通foreach+if也可以安全地遍历删除 是因为线程安全的容器 内部实现了锁机制 一般用ReentrantLock做的
一.List/Set
1.List<T>遵循放入顺序 成员可重复
2.Set<T>不遵循放入顺序 成员不可重复
-内部判重用hashcode()与equals()双重判断
二.HashSet/TreeSet
-HashSet set=new HashSet(不可传入比较器);
-TreeSet set=new TreeSet(可传入比较器);
-可传入比较器 才能做到自定义排序
四.列举几个线程安全的容器
-Vector CopyOnWriteArrayList
-HashTable ConcurrentHashMap
-很多线程不安全的容器使用率很高 是因为用其他方法规避了安全问题 比如定义在方法内部(栈封闭) ThreadLocal封闭等等 或业务上有加锁机制
-即使是线程安全的容器 也只能保证单步api操作具备原子性
-ConcurrentHashMap 比较特殊 在线程安全得以保证时还能有很高的并发性能 因为采用了分段锁机制