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

HashMap 和 Hashtable的區(qū)別

 更新時間:2016年09月06日 17:14:12   作者:唐小娟  
本文主要介紹HashMap 和 Hashtable的區(qū)別,這里整理了相關(guān)資料并詳細介紹了HashMap 和 Hashtable的區(qū)別及其工作原理和使用方法,有需要的朋友可以看一下

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

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

HashMap和Hashtable的區(qū)別

HashMap和Hashtable都實現(xiàn)了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區(qū)別有:線程安全性,同步(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. 另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。
  4. 由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
  5. HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

要注意的一些重要術(shù)語:

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

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

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

我們能否讓HashMap同步?

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

結(jié)論

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

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

相關(guān)文章

  • java8使用filter()取出自己所需數(shù)據(jù)

    java8使用filter()取出自己所需數(shù)據(jù)

    這篇文章主要介紹了java8使用filter()取出自己所需數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 一文帶你探索Java中的通配符與泛型

    一文帶你探索Java中的通配符與泛型

    Java 語言中的泛型是一種強大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性,本文將深入講解 Java 通配符和泛型,有需要的小伙伴可以了解下
    2023-12-12
  • 一文搞懂Java中的線程安全與線程同步

    一文搞懂Java中的線程安全與線程同步

    線程安全指在被多個線程訪問時,程序可以持續(xù)進行正確的處理。線程同步是指程序中用于控制不同線程間操作發(fā)生相對順序的機制。本文將通過示例詳細為大家講講二者的使用,需要的可以參考一下
    2022-06-06
  • MySql多表查詢 事務及DCL

    MySql多表查詢 事務及DCL

    這篇文章主要介紹了MySql多表查詢 、事務、DCL的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • MyBatisPlus中使用or()和and()遇到的問題及細節(jié)處理

    MyBatisPlus中使用or()和and()遇到的問題及細節(jié)處理

    這篇文章主要介紹了MyBatisPlus中使用or()和and()遇到的問題,本文通過多種寫法實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java+MySQL實現(xiàn)設(shè)計優(yōu)惠券系統(tǒng)

    Java+MySQL實現(xiàn)設(shè)計優(yōu)惠券系統(tǒng)

    這篇文章主要介紹了Java+MySQL實現(xiàn)設(shè)計優(yōu)惠券系統(tǒng),文章基于Java與MySQL的相關(guān)資料展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Java實現(xiàn)寵物商店管理

    Java實現(xiàn)寵物商店管理

    這篇文章主要為大家詳細介紹了Java實現(xiàn)寵物商店管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 使用SpringMVC訪問Controller接口返回400BadRequest

    使用SpringMVC訪問Controller接口返回400BadRequest

    這篇文章主要介紹了使用SpringMVC訪問Controller接口返回400BadRequest,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 使用java實現(xiàn)日志工具類分享

    使用java實現(xiàn)日志工具類分享

    這篇文章主要介紹的Java代碼工具類是用于書寫日志信息到指定的文件,并且具有刪除之前日志文件的功能,需要的朋友可以參考下
    2014-03-03
  • 深入學習Java 動態(tài)代理

    深入學習Java 動態(tài)代理

    Java 動態(tài)代理機制的出現(xiàn),使得 Java 開發(fā)人員不用手工編寫代理類,只要簡單地指定一組接口及委托類對象,便能動態(tài)地獲得代理類。下面小編和大家來一起學習一下吧
    2019-05-05

最新評論