欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年01月06日 10:49:06   投稿:hebedich  
Hashtable的應(yīng)用非常廣泛,HashMap是新框架中用來代替Hashtable的類,也就是說建議使用HashMap,不要使用Hashtable??赡苣阌X得Hashtable很好用,為什么不用呢?這里簡單分析他們的區(qū)別。

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ù)組默認大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認大小是16,而且一定是2的指數(shù)。

相關(guān)文章

  • Java中的注解、元注解詳細解析

    Java中的注解、元注解詳細解析

    這篇文章主要介紹了Java中的注解、元注解詳細解析,注解也叫元數(shù)據(jù),與類、接口、枚舉是在同一個層次,它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進行說明,注釋,需要的朋友可以參考下
    2023-11-11
  • 通過實例講解springboot整合WebSocket

    通過實例講解springboot整合WebSocket

    這篇文章主要介紹了通過實例講解springboot整合WebSocket,WebSocket為游覽器和服務(wù)器提供了雙工異步通信的功能,即游覽器可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向游覽器發(fā)送消息。,需要的朋友可以參考下
    2019-06-06
  • 關(guān)于SpringBoot集成Lettuce連接Redis的方法和案例

    關(guān)于SpringBoot集成Lettuce連接Redis的方法和案例

    這篇文章主要介紹了關(guān)于SpringBoot集成Lettuce連接Redis的方法和案例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • [Spring MVC] -簡單表單提交實例

    [Spring MVC] -簡單表單提交實例

    本篇文章主要介紹了[Spring MVC] -簡單表單提交實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。
    2016-12-12
  • 自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問題

    自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問題

    這篇文章主要介紹了自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 源碼分析ConcurrentHashMap如何保證線程安全

    源碼分析ConcurrentHashMap如何保證線程安全

    這篇文章將結(jié)合底層源碼為大家詳細介紹一下ConcurrentHashMap是如何保證線程安全的,文中是示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-06-06
  • Java界面編程實現(xiàn)界面跳轉(zhuǎn)

    Java界面編程實現(xiàn)界面跳轉(zhuǎn)

    這篇文章主要為大家詳細介紹了Java界面編程實現(xiàn)界面跳轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • springboot 單文件上傳的實現(xiàn)步驟

    springboot 單文件上傳的實現(xiàn)步驟

    這篇文章主要介紹了springboot實現(xiàn)單文件上傳的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2021-02-02
  • Java的MD5工具類和客戶端測試類

    Java的MD5工具類和客戶端測試類

    這篇文章主要介紹了Java的MD5工具類和客戶端測試類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • Spring中@Autowired自動注入map詳解

    Spring中@Autowired自動注入map詳解

    這篇文章主要介紹了Spring中@Autowired自動注入map詳解,  spring是支持基于接口實現(xiàn)類的直接注入的,支持注入map,list等集合中,不用做其他的配置,直接注入,需要的朋友可以參考下
    2023-10-10

最新評論