一、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那样产生阻塞。
网友评论