一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - HashMap 和 Hashtable的區別

HashMap 和 Hashtable的區別

2020-06-11 16:26唐小娟 JAVA教程

本文主要介紹HashMap 和 Hashtable的區別,這里整理了相關資料并詳細介紹了HashMap 和 Hashtable的區別及其工作原理和使用方法,有需要的朋友可以看一下

HashMap和Hashtable的比較是Java面試中的常見問題,用來考驗程序員是否能夠正確使用集合類以及是否可以隨機應變使用多種思路解決問題。HashMap的工作原理、ArrayList與Vector的比較以及這個問題是有關Java 集合框架的最經典的問題。Hashtable是個過時的集合類,存在于Java API中很久了。在Java 4中被重寫了,實現了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面試中相當容易被問到,甚至成為了集合框架面試題中最常被考的問題,所以在參加任何Java面試之前,都不要忘了準備這一題。

這篇文章中,我們不僅將會看到HashMap和Hashtable的區別,還將看到它們之間的相似之處。

HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。

  1. HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
  3. 另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
  4. 由于Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
  5. HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

要注意的一些重要術語:

1) sychronized意味著在一次僅有一個線程能夠更改Hashtable。就是說任何線程要更新Hashtable時要首先獲得同步鎖,其它線程要等到同步鎖被釋放之后才能再次獲得同步鎖更新Hashtable。

2) Fail-safe和iterator迭代器相關。如果某個集合對象創建了Iterator或者ListIterator,然后其它的線程試圖“結構上”更改集合對象,將會拋出ConcurrentModificationException異常。但其它線程可以通過set()方法更改集合對象是允許的,因為這并沒有從“結構上”更改集合。但是假如已經從結構上進行了更改,再調用set()方法,將會拋出IllegalArgumentException異常。

3) 結構上的更改指的是刪除或者插入一個元素,這樣會影響到map的結構。

我們能否讓HashMap同步?

HashMap可以通過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);

結論

Hashtable和HashMap有幾個主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時候使用Hashtable,而如果你使用Java 5或以上的話,請使用ConcurrentHashMap吧。

原文鏈接: Javarevisited 翻譯: ImportNew.com - 唐小娟
譯文鏈接: http://www.importnew.com/7010.html

延伸 · 閱讀

精彩推薦
  • JAVA教程java執行bat命令碰到的阻塞問題的解決方法

    java執行bat命令碰到的阻塞問題的解決方法

    這篇文章主要介紹了java執行bat命令碰到的阻塞問題的解決方法,有需要的朋友可以參考一下 ...

    java教程網3102019-11-03
  • JAVA教程java 實現回調代碼實例

    java 實現回調代碼實例

    本文主要介紹Java的回調機制,并附實例代碼以供大家參考學習,有需要的小伙伴可以看下 ...

    java教程網1902020-05-29
  • JAVA教程Java發送郵件javax.mail的實現方法

    Java發送郵件javax.mail的實現方法

    這篇文章主要為大家介紹了Java發送郵件javax.mail的實現方法,具有一定的參考價值,代碼都有詳細的注釋,感興趣的小伙伴們可以參考一下 ...

    lijiao4202020-03-24
  • JAVA教程java實現列表、集合與數組之間轉化的方法

    java實現列表、集合與數組之間轉化的方法

    這篇文章主要介紹了java實現列表、集合與數組之間轉化的方法,涉及java中列表、集合與數組相互轉換的技巧,非常具有實用價值,需要的朋友可以參考下 ...

    damaolly3522019-12-12
  • JAVA教程Java編程代碼性能優化

    Java編程代碼性能優化

    本文介紹了 Java 代碼優化的過程,總結了優化 Java 程序的一些最佳實踐,分析了進行優化的方法,并解釋了性能提升的原因,需要的朋友可以參考下 ...

    hebedich2262020-01-21
  • JAVA教程分享java中設置代理的兩種方式

    分享java中設置代理的兩種方式

    有時候我們的程序中要提供可以使用代理訪問網絡,代理的方式包括http、https、ftp、socks代理。比如在IE瀏覽器設置代理,這里簡單介紹下,需要的朋友可以參...

    天魂地煞3412020-03-10
  • JAVA教程使用Shiro實現登錄成功后跳轉到之前的頁面

    使用Shiro實現登錄成功后跳轉到之前的頁面

    這篇文章主要介紹了如何使用Shiro實現不同用戶登錄成功后跳轉到不同主頁,實現此功能目前比較好的方法是用ajax的方法登錄,第二種方法是把用戶未登錄...

    蘭幽2592019-12-29
  • JAVA教程Mybatis全面分頁插件

    Mybatis全面分頁插件

    這篇文章主要為大家詳細介紹了Mybatis全面分頁插件的使用方法,比較適用于在分頁時候進行攔截,感興趣的小伙伴們可以參考一下 ...

    junehappylove4302020-06-06
主站蜘蛛池模板: 70老妇牲交毛片 | 亚洲成人网导航 | 国产高清露脸学生在线观看 | 91麻豆精东果冻天美传媒老狼 | 农村脱精光一级 | 韩国女主播一区二区视频 | www91在线观看 | 亚洲福利一区二区三区 | a一级一级| 91国内精品久久久久影院优播 | 成人福利在线观看 | 99re这里只有精品视频在线观看 | 国产成人精品一区二区不卡 | 久久毛片网站 | 男生操女生的漫画 | www.片| 精品亚洲午夜久久久久 | 日本 片 成人 在线 日b视频免费 | 海绵宝宝第二季全集免费观看 | 国产三级自拍 | 牛牛色婷婷在线视频播放 | 五月色婷婷久久综合 | 欧美一级特黄特色大片 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 精品久久看 | 免费欧美视频 | 欧美free激情野战hd | 91久久精品青青草原伊人 | 4455四色永久免费 | 免费一级毛片在线播放 | 欧美日本一本线在线观看 | 国产欧美国产精品第一区 | 成人福利免费在线观看 | 甜蜜惩罚小说 | 国产综合网站 | 日本动漫打扑克动画片樱花动漫 | 国产免费专区 | 国产免费一区二区三区 | 成人影院在线观看免费 | 国产清纯白嫩大学生正在播放 | 日本高清色视频www 日本高清免费观看 |