HashMap和Hashtable的區(qū)別
都實(shí)現(xiàn)了Map接口差凹,差別在于速度期奔、線(xiàn)程安全和同步性
1、HashMap是非synchronized的危尿,可以接受為null的鍵值(key)和值(value); HashTable 是synchronized的呐萌,不能接收null
2、HashMap是非synchronized谊娇,而Hashtable是synchronized肺孤,這意味著Hashtable是線(xiàn)程安全的,多個(gè)線(xiàn)程可以共享一個(gè)Hashtable邮绿,如果沒(méi)有正確的同步的話(huà)渠旁,多個(gè)線(xiàn)程不能共享HashMap。Java 5提供了ConcurrentHashMap船逮,它是HashTable的替代顾腊,比HashTable的擴(kuò)展性更好。
3挖胃、另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器杂靶,而Hashtable的enumerator迭代器不是fail-fast的梆惯。所以當(dāng)有其它線(xiàn)程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會(huì)拋出ConcurrentModificationException吗垮,但迭代器本身的remove()方法移除元素則不會(huì)拋出ConcurrentModificationException異常垛吗。但這并不是一個(gè)一定發(fā)生的行為
4、HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的烁登。
讓HashMap同步的方法
- Collections.synchronizeMap(hashMap);
- 使用ConcurrentHashMap
HashMap和HashSet的區(qū)別
1.HashSet實(shí)現(xiàn)了Set接口怯屉,它不允許集合中有重復(fù)的值,當(dāng)我們提到HashSet時(shí)饵沧,第一件事情就是在將對(duì)象存儲(chǔ)在HashSet之前锨络,要先確保對(duì)象重寫(xiě)equals()和hashCode()方法,這樣才能比較對(duì)象的值是否相等狼牺,以確保set中沒(méi)有儲(chǔ)存相等的對(duì)象羡儿。如果我們沒(méi)有重寫(xiě)這兩個(gè)方法,將會(huì)使用這個(gè)方法的默認(rèn)實(shí)現(xiàn)是钥。public boolean add(Object o)方法用來(lái)在Set中添加元素掠归,當(dāng)元素值重復(fù)時(shí)則會(huì)立即返回false,如果成功添加的話(huà)會(huì)返回true