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

1枫匾、講這兩者之前先講一講 ==哑芹,equals() 與hashcode()之間的關(guān)系

1.1 ==對于java中基本數(shù)據(jù)類型變量就是比較變量值花盐;對于非基本數(shù)據(jù)類型類型执虹,比較的是對象在內(nèi)存中的地址拓挥;
1.2 equals()是所有類(所有類都繼承自O(shè)bject)中都含有的一個方法,當(dāng)沒有重寫equals()方法時袋励,equals()等價于==也是判斷內(nèi)存地址是否相同侥啤,重寫的情況下往往用來判斷屬性是否相同当叭;
1.3 hashcode()也是每個類(Object類中的方法)都有的方法,當(dāng)不重寫該方法時盖灸,某些jvm會將內(nèi)存地址作為返回值蚁鳖。
1.4 因為Java的集合需要存取對象時,是要根據(jù)對象的hashcode方法的返回值來確定對象是否相同赁炎,所以要保證你的類使用Java集合不出異常的話醉箕,我們必須遵循以下規(guī)則:
1)當(dāng)兩個對象equals()比較相同時,它們的hashcode()返回值也一定相同徙垫;
2)當(dāng)兩個對象hashcode()返回值相同時讥裤,它們equals()比較未必相同;
1.5 重寫hashcode()方法也很簡單姻报,往往通過計算相關(guān)字段的哈希碼己英,再把這些哈希碼組合起來得到哈希碼。
舉個例子:

@Override
public int hashcode(){     
    return Objects.hash(firstName, lastName); 
}
2吴旋、現(xiàn)在進入正題损肛,來說說HashMap與Hashtable的區(qū)別

2.1 HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的荣瑟,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value)治拿,而Hashtable則不行)。
2.2 HashMap是非synchronized笆焰,而Hashtable是synchronized忍啤,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable仙辟;而如果沒有正確的同步的話,多個線程是不能共享HashMap的鳄梅。
2.3 由于Hashtable是線程安全的也是synchronized叠国,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步戴尸,只需要單一線程粟焊,那么使用HashMap性能要好過Hashtable。
2.4 HashMap可以通過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);

3孙蒙、hashmap與hashtable的實現(xiàn)

3.1 初始容量大小和每次擴充容量大小
1)HashMap默認(rèn)的初始化大小為16项棠。之后每次擴充,容量變?yōu)樵瓉淼?倍挎峦。
2)Hashtable默認(rèn)的初始大小為n香追,之后每次擴充,容量變?yōu)樵瓉淼?n+1坦胶;
HashMap的初始大小固定為16透典,而Hashtable由你給定晴楔。
之所以會有這樣的不同,是因為Hashtable和HashMap設(shè)計時的側(cè)重點不同峭咒。Hashtable的側(cè)重點是哈希的結(jié)果更加均勻税弃,使得哈希沖突減少。當(dāng)哈希表的大小為素數(shù)時凑队,簡單的取模哈希的結(jié)果會更加均勻则果。而HashMap則更加關(guān)注hash的計算效率問題。在取模計算時漩氨,如果模數(shù)是2的冪西壮,那么我們可以直接使用位運算來得到結(jié)果,效率要大大高于做除法才菠。HashMap為了加快hash的速度茸时,將哈希表的大小固定為了2的冪。當(dāng)然這引入了哈希分布不均勻的問題赋访,所以HashMap為解決這問題可都,又對hash算法做了一些改動。這從而導(dǎo)致了Hashtable和HashMap的計算hash值的方法不同
3.2 計算hash值的方法
1)HashMap計算hash值的方法

int hash = key.hashCode();
int index = hash & map.length();

2)Hashtable計算hash值的方法

int hash = key.hashCode();
int index =( hash & 0x7FFFFFFF) % table.length();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚓耽,一起剝皮案震驚了整個濱河市渠牲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌步悠,老刑警劉巖签杈,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鼎兽,居然都是意外死亡答姥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門谚咬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹦付,“玉大人,你說我怎么就攤上這事择卦∏贸ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵秉继,是天一觀的道長祈噪。 經(jīng)常有香客問我,道長尚辑,這世上最難降的妖魔是什么辑鲤? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腌巾,結(jié)果婚禮上遂填,老公的妹妹穿的比我還像新娘铲觉。我一直安慰自己,他們只是感情好吓坚,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布撵幽。 她就那樣靜靜地躺著,像睡著了一般礁击。 火紅的嫁衣襯著肌膚如雪盐杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天哆窿,我揣著相機與錄音链烈,去河邊找鬼。 笑死挚躯,一個胖子當(dāng)著我的面吹牛强衡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播码荔,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漩勤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缩搅?” 一聲冷哼從身側(cè)響起越败,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硼瓣,沒想到半個月后究飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡堂鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年亿傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟栖。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袱蜡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慢宗,到底是詐尸還是另有隱情,我是刑警寧澤奔穿,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布镜沽,位于F島的核電站,受9級特大地震影響贱田,放射性物質(zhì)發(fā)生泄漏缅茉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一男摧、第九天 我趴在偏房一處隱蔽的房頂上張望蔬墩。 院中可真熱鬧译打,春花似錦、人聲如沸拇颅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樟插。三九已至韵洋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黄锤,已是汗流浹背搪缨。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸵熟,地道東北人副编。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像流强,于是被迫代替她去往敵國和親痹届。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容