最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中HashTable和HashMap的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理

 更新時間:2017年04月27日 11:07:05   投稿:mrr  
HashTable和HashMap主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。接下來通過本文給大家簡單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧

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

HashMap幾乎可以等價(jià)于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap allows one null key and any number of null values.,而Hashtable則不行)。這就是說,HashMap中如果在表中沒有發(fā)現(xiàn)搜索鍵,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個空的值,那么get()將返回null。如果有必要,用containKey()方法來區(qū)別這兩種情況。

HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。 即是說,在多線程應(yīng)用程序中,不用專門的操作就安全地可以使用Hashtable了;而對于HashMap,則需要額外的同步機(jī)制。但HashMap的同步問題可通過Collections的一個靜態(tài)方法得到解決:

    Map Collections.synchronizedMap(Map m)

   這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環(huán)境中也是安全的。而且Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴(kuò)展性更好。

另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。

由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。

HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

哈希值的使用不同,HashTable直接使用對象的hashCode,代碼是這樣的:

 int hash = key.hashCode();
   int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新計(jì)算hash值,而且用與代替求模:

int hash = hash(k);
int i = indexFor(hash, table.length);

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

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

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

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

以上所述是小編給大家介紹的HashTable和HashMap的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼

    springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn),JSR303校驗(yàn)方法有統(tǒng)一校驗(yàn)的需求,統(tǒng)一校驗(yàn)實(shí)現(xiàn)以及分組校驗(yàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Java通過接口實(shí)現(xiàn)匿名類的實(shí)例代碼

    Java通過接口實(shí)現(xiàn)匿名類的實(shí)例代碼

    這篇文章介紹了Java通過接口實(shí)現(xiàn)匿名類的實(shí)例代碼,有需要的朋友可以參考一下
    2013-10-10
  • Java訪問控制符原理及具體用法解析

    Java訪問控制符原理及具體用法解析

    這篇文章主要介紹了Java訪問控制符原理及具體用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java連接合并2個數(shù)組(Array)的5種方法例子

    Java連接合并2個數(shù)組(Array)的5種方法例子

    最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,突然發(fā)現(xiàn)以前沒用過,于是研究了一下合并數(shù)組的方式,這篇文章主要給大家介紹了關(guān)于Java連接合并2個數(shù)組(Array)的5種方法,需要的朋友可以參考下
    2023-12-12
  • 詳解JDBC對Mysql utf8mb4字符集的處理

    詳解JDBC對Mysql utf8mb4字符集的處理

    這篇文章主要介紹了詳解JDBC對Mysql utf8mb4字符集的處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • java基本教程之線程讓步 java多線程教程

    java基本教程之線程讓步 java多線程教程

    本文對Thread中的線程讓步方法yield()進(jìn)行介紹,yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級的等待線程獲取執(zhí)行權(quán),大家參考使用吧
    2014-01-01
  • Java編程cas操作全面解析

    Java編程cas操作全面解析

    這篇文章通過實(shí)例,解析了Java編程中cas操作的概念、原理以及用法,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • SpringBoot整合tkMapper的方法

    SpringBoot整合tkMapper的方法

    項(xiàng)目使用SpringBoot2.0,H2數(shù)據(jù)庫,使用了?Lombok?簡化代碼,下面是本人使用SpringBoot整合tkMapper的一個小demo,記錄下來本人在此處踩得坑
    2022-11-11
  • SpringBoot如何導(dǎo)出Jar包并測試(使用IDEA)

    SpringBoot如何導(dǎo)出Jar包并測試(使用IDEA)

    這篇文章主要介紹了SpringBoot如何導(dǎo)出Jar包并測試(使用IDEA),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 關(guān)于spring?aop兩種代理混用的問題

    關(guān)于spring?aop兩種代理混用的問題

    這篇文章主要介紹了關(guān)于spring?aop兩種代理混用的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

麟游县| 河源市| 鄂托克旗| 额敏县| 北辰区| 新河县| 平乐县| 双牌县| 宁乡县| 桐梓县| 蕉岭县| 茌平县| 阜南县| 皮山县| 闵行区| 福泉市| 伊宁市| 合水县| 马公市| 平凉市| 百色市| 泽库县| 双江| 富裕县| 澄迈县| 丹江口市| 东兰县| 龙里县| 龙江县| 新沂市| 萍乡市| 双峰县| 东阿县| 浦东新区| 崇礼县| 盐山县| 永福县| 沁源县| 惠水县| 左贡县| 宝清县|