一、Vector、LinkedList、ArrayList
-
Vector、ArrayList是使用数组实现的,LinkedList是使用链表实现的
2)Vector是线程安全的,LinkedList、ArrayList不是线程安全的
如果涉及到多线程,那么就选择
Vector,如果不涉及到多线程就从LinkedList、ArrayList中选。LinkedList更适合从中间插入或者删除(链表的特性)。ArrayList更适合检索和在末尾插入或删除(数组的特性)。
PS: Collections.synchronizedList(List list)方法也可以用来返回一个线程安全的List。参见SynchronizedList和Vector的区别
二、HashMap、HashTable、ConcurentHashMap
HashMap和HashTable都实现了Map接口,ConcurrentHashMap实现了ConcurrentMap接口HashMap和ConcurrentHashMap都继承了AbstractMap类,HashTable继承了Dictionary类
3)HashTable和ConcurrentHashMap是线程安全的,HashMap不是线程安全的。
当一个线程访问
HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。ConcurrentHashMap使用锁分段技术,将数据分成一段一段的存储,给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
如果不涉及到多线程处理的情况,就是用hashMap,因为他的效率比较高。在有并发请求的场景中,如果数据的强一致性比较重要,那么就请使用hashTable,因为ConcurrentHashMap的get,clear,iterator 都是弱一致性的。如果效率要求比较高,那么就使用ConcurrentHashMap,因为他不会像hashTable那样产生阻塞。