再談HashMap與HashTable,引入TreeMap淺談

(1)首先說明HashMap與HashTable: java

HashMap是線程不安全的,是對HashTable的輕量級實現,都是對雙列數據的存儲。HashMap是在jdk1.2引進的對Map的實現,HashTable出現較早。 程序員

HashMap容許null-key && null-value,可是HashTable不容許。 數組

HashMap把HashTable的contains方法去掉了,改成了containsKey,containsValue,避免誤解。 安全

最大的不一樣點: 數據結構

HashMap線程不安全,容許null-key,null-value;HashTable線程安全(方法加synchronized),且不容許null-key,null-value; 多線程

正由於HashMap不安全,因此在多線程使用時須要考慮同步的問題,而HashTable不須要。 oracle

(2)TreeMap 測試

HashMap和HashTable裏存儲的數據都是無序的,TreeMap裏的數據是有序的,因此這個是他們之間的最大特色!TreeMap使用二叉樹排序,HashMap使用哈希表,因此HashMap一般比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在須要排序的Map時候才用TreeMap。 

spa

測試代碼: .net

import java.util.Map;    
import java.util.HashMap;    
import java.util.Set;    
import java.util.HashSet;    
import java.util.Iterator;    
import java.util.Hashtable;    
import java.util.TreeMap;    
class  HashMaps    
{    
       public static void main(String[] args)     
      {    
            Map map=new HashMap();                
            map.put("a", "aaa");    
            map.put("b", "bbb");    
            map.put("c", "ccc");    
            map.put("d", "ddd");    
               
            Iterator iterator = map.keySet().iterator();                
            while (iterator.hasNext()) {    
             Object key = iterator.next();    
             System.out.println("map.get("+key+") is :"+map.get(key));    
            }           
            /**
             * HashMap和TreeMap有什麼區別。HashMap經過hashcode對其內容進行快速查找,
             * 而TreeMap中全部的元素都保持着某種固定的順序,若是你須要獲得一個
             * 有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
             */
            Hashtable tab=new Hashtable();                
            tab.put("a", "aaa");    
            tab.put("b", "bbb");    
            tab.put("c", "ccc");    
            tab.put("d", "ddd");    
            Iterator iterator_1 = tab.keySet().iterator();    
            while (iterator_1.hasNext()) {    
             Object key = iterator_1.next();    
             System.out.println("tab.get("+key+") is :"+tab.get(key));    
            }             
                
            TreeMap tmp=new TreeMap();                
            tmp.put("a", "aaa");    
            tmp.put("b", "bbb");    
            tmp.put("c", "ccc");    
            tmp.put("d", "ddd");    
            Iterator iterator_2 = tmp.keySet().iterator();    
            while (iterator_2.hasNext()) {    
             Object key = iterator_2.next();    
             System.out.println("tmp.get("+key+") is :"+tmp.get(key));    
            }             
       }    
}


詳細出處參考:http://www.jb51.net/article/32652.htm

(3)HashMap經過HashCode對其內容進行快速查找,而TreeMap中全部的元素都保持着固定的順序。若是要獲得有序的結果就使用Treemap。HashMap的子類LinkedHashMap也能夠實現有序排列。

Object中的hashCode返回值至關於當前的地址,也就是說對於不一樣對象,即便他們的內容徹底相同,但HashCode卻不相同。若是比較HashMap中存儲的Value對象內容是否相等,則須要覆蓋hashCode()和equals()方法。

八、 怎樣使Hashmap同步?

HashMap能夠經過Map m = Collections.synchronizedMap(hashMap)來達到同步的效果。

十、爲何Vector類認爲是廢棄的或者是非官方地不推薦使用?或者說爲何咱們應該一直使用ArrayList而不是Vector

你應該使用ArrayList而不是Vector是由於默認狀況下你是非同步訪問的,Vector同步了每一個方法,你幾乎從不要那樣作,一般有想要同步的是整個操做序列。同步單個的操做也不安全(若是你迭代一個Vector,你仍是要加鎖,以免其它線程在同一時刻改變集合).並且效率更慢。固然一樣有鎖的開銷即便你不須要,這是個很糟糕的方法在默認狀況下同步訪問。你能夠一直使用Collections.sychronizedList來裝飾一個集合。

事實上Vector結合了「可變數組」的集合和同步每一個操做的實現。這是另一個設計上的缺陷。Vector還有些遺留的方法在枚舉和元素獲取的方法,這些方法不一樣於List接口,若是這些方法在代碼中程序員更趨向於想用它。儘管枚舉速度更快,可是他們不能檢查若是集合在迭代的時候修改了,這樣將致使問題。儘管以上諸多緣由,oracle也從沒宣稱過要廢棄Vector.

相關文章
相關標籤/搜索