国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中Hashtable類與HashMap類的區(qū)別詳解

2019-11-26 14:41:53
字體:
供稿:網(wǎng)友

Hashtable類

Hashtable繼承Map接口,實現(xiàn)一個key-value映射的哈希表。任何非空(non-null)的對象都可作為key或者value。

添加數(shù)據(jù)使用put(key, value),取出數(shù)據(jù)使用get(key),這兩個基本操作的時間開銷為常數(shù)。

Hashtable通過initial capacity和load factor兩個參數(shù)調(diào)整性能。通常缺省的load factor 0.75較好地實現(xiàn)了時間和空間的均衡。增大load factor可以節(jié)省空間但相應(yīng)的查找時間將增大,這會影響像get和put這樣的操作。
使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”:

Hashtable numbers = new Hashtable();numbers.put("one", new Integer(1));numbers.put("two", new Integer(2));numbers.put("three", new Integer(3));

要取出一個數(shù),比如2,用相應(yīng)的key:

Integer n = (Integer)numbers.get("two");System.out.println("two = " + n);

由于作為key的對象將通過計算其散列函數(shù)來確定與之對應(yīng)的value的位置,因此任何作為key的對象都必須實現(xiàn)hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當(dāng)作key的話,要相當(dāng)小心,按照散列函數(shù)的定義,如果兩個對象相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個對象不同,則它們的hashCode不一定不同,如果兩個不同對象的hashCode相同,這種現(xiàn)象稱為沖突,沖突會導(dǎo)致操作哈希表的時間開銷增大,所以盡量定義好的hashCode()方法,能加快哈希表的操作。

如果相同的對象有不同的hashCode,對哈希表的操作會出現(xiàn)意想不到的結(jié)果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時復(fù)寫equals方法和hashCode方法,而不要只寫其中一個。
Hashtable是同步的。

HashMap類

HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過高,或者load factor過低。

總結(jié)

  1. Hashtable的方法是同步的,HashMap則是非同步的,所以在多線程場合要手動同步HashMap,這個區(qū)別就像Vector和ArrayList一樣。
  2. Hashtable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。
  3. Hashtable比HashMap多一個elements方法用于遍歷。
  4. Hashtable使用Enumeration,HashMap使用Iterator。
  5. 哈希值的使用不同,Hashtable直接使用對象的hashCode,而HashMap重新計算hash值,而且用與代替求模。
  6. Hashtable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉定区| 睢宁县| 罗平县| 阳新县| 赤峰市| 尼玛县| 耿马| 邵东县| 香河县| 丰县| 基隆市| 大兴区| 家居| 石家庄市| 青冈县| 鲜城| 巨野县| 朝阳市| 融水| 东平县| 青河县| 攀枝花市| 池州市| 雷山县| 集贤县| 远安县| 茂名市| 汽车| 固阳县| 聂拉木县| 晋州市| 历史| 鄄城县| 察隅县| 绥中县| 蓬莱市| 晋宁县| 丰顺县| 蓬莱市| 伊金霍洛旗| 马边|