pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

為什么要在 HashMap 中使用哈希方法

Why hash method in HashMap(為什么要在 HashMap 中使用哈希方法)
本文介紹了為什么要在 HashMap 中使用哈希方法的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

hash 方法狀態的Java doc,

Java doc of hash method states,

檢索對象散列碼并將補充散列函數應用于結果散列,以防止劣質散列函數.這很關鍵,因為 HashMap 使用長度為二的冪的哈希表,否則會遇到低位沒有差異的 hashCode 的沖突.

Retrieve object hash code and applies a supplemental hash function to the result hash, which defends against poor quality hash functions. This is critical because HashMap uses power-of-two length hash tables, that otherwise encounter collisions for hashCodes that do not differ in lower bits.

我無法理解的是,

1) 為什么 HashMap 使用長度為二的冪的哈希表?

1) Why HashMap uses power-of-two length hash tables?

在聲明表時也有說明:

/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry<K,V>[] table;

為什么會有這個限制?

2) 否則會遇到低位相同的 hashCode 沖突. 是什么意思?

推薦答案

hashmap 的目的是快速縮小在搜索特定鍵時需要查看的對象數量(理想情況下為 0 或 1).

The purpose of a hashmap is to very quickly narrow down how many objects you need to look at (ideally 0 or 1) when searching for a specific key.

HashMap.get(key)的一般方法如下:

  1. 調用 key.hashCode() 以獲取表示對象的單個整數.

  1. Call key.hashCode() to get a single integer that represents the object.

查看基于該哈希碼的哈希桶",其中可以包含零個或多個條目.

Look in a hash "bucket" based on that hashcode, which can contain zero or more entries.

遍歷bucket中的每一個entry,看看是否有entry的key是.equals(key).如果是這樣,請將其退回.如果存儲桶中沒有條目與搜索的條目具有相同的鍵,則返回 null.

Go through each entry in the bucket and find if any entry's key is .equals(key). If so, return it. If no entry in the bucket has an equal key to the one searched for, return null.

good hashmap 和 bad hashmap 的區別在于速度.您必須平衡所有這三個問題:

The difference between a good hashmap and a bad hashmap is speed. You have to balance all three of these concerns:

  1. 您可以多快將密鑰轉換為哈希碼?

  1. How quickly can you transform the key into a hashcode?

兩個不同的鍵映射到同一個哈希碼的頻率如何?

How often do two different keys map to the same hashcode?

您多久會將具有不同哈希碼的兩個密鑰放入同一個桶"中?

How often will you put two keys with different hashcodes into the same "bucket"?

Java 的設計者選擇了一組他們認為最平衡的折衷方案.沒有正確的答案,但您必須選擇一種特定的方法,并在文檔中寫入該方法是什么.

Java's designers have chosen a set of tradeoffs they think balances best. There is no right answer, but you do have to choose a specific approach, and write into the documentation what that approach is.

Java 的設計者可能有一些基于添加到哈希圖中的典型數據的統計證據.

Java's designers likely have some statistic evidence based on typical data added to hashmaps.

他們選擇通過提取哈希碼的最低 n 位來將哈希碼轉換為桶,因為這些位的變化比高位更頻繁.他們選擇提取位而不是另一種將哈希碼轉換為桶的典型方法(除以素數后的整數余數),因為在 Java 最常部署到的平臺上,這通常是一種更快的操作.

They chose to convert hashcode to bucket by extracting the lowest n bits of the hashcode, because those vary more often than the upper bits. They chose extracting bits over another typical method of converting hashcode to bucket (integer remainder after dividing by a prime number) because it's typically a faster operation on the platforms Java is most commonly deployed to.

Java 的設計者可能發現,第 1 步,hashCode() 的實現,是由 Java 用戶編寫的,而且通常很糟糕,為他們想要的許多對象返回相同的 hashCode存儲在同一個哈希圖中.想象一下,如果 hashCode 是這樣的:

What Java's designers may have found is that step 1, the implementation of hashCode(), is written by Java users, and can often be terrible, returning the same hashCode for lots of objects they want to store in the same hashmap. Imagine if the hashCode was this:

public class MyInteger {
    final int i;
    public MyInteger(int i) {
        this.i = i;
    }
    public int hashCode() {
        return i << 24; // will return 0x00000000, 0x01000000, etc.
    }
    public boolean equals(Object o) {
        return (o != null) && (o instanceof MyInteger) && ((MyInteger)o).i == i;
    }
}

這就是他們所說的劣質";哈希碼的低位變化不大.在這種病態的實現中,低 24 位根本沒有變化!

This is what they call "poor quality"; the lower bits of the hashcode don't vary very much. In this pathological implementation, the lower 24 bits don't vary at all!

在這種情況下,對于任何小于 16,777,216 個桶的 hashmap,可以進入 hashmap 的每個鍵都將轉到桶 0.其他 16,777,215 個桶將為空.

In this case, for hashmaps any smaller than 16,777,216 buckets, every single key that could go in the hashmap will go to bucket 0. The other 16,777,215 buckets will be empty.

其他人的哈希碼可能沒有這么糟糕,但它們已經夠糟糕了,以至于 Java 的設計者選擇添加第二個哈希碼來幫助提高兩個不同鍵進入兩個不同存儲桶的機會,從而減少對象的數量每次檢索給定鍵時都需要檢查是否相等.

Other people's hashcodes may not be as bad as this, but they're bad enough that Java's designers chose to add a second hashcode to help improve the chance that two different keys will go into two different buckets, thus reducing how many objects need to be checked for equality each time a given key is retrieved.

這篇關于為什么要在 HashMap 中使用哈希方法的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Convert List of Strings into Map using Java-8 Streams API(使用 Java-8 Streams API 將字符串列表轉換為 Map)
Getting data from JSON(從 JSON 獲取數據)
java linkedhashmap iteration(javalinkedhashmap迭代)
Converting a list of objects to Map(將對象列表轉換為 Map)
Create a HashMap with a fixed Key corresponding to a HashSet. point of departure(用一個固定的Key對應一個HashSet創建一個HashMap.出發點)
HttpMessageConverter exception : RestClientException: Could not write request: no suitable HttpMessageConverter found(HttpMessageConverter 異常:RestClientException:無法寫入請求:找不到合適的 HttpMessageConverter) - IT屋-程序員
主站蜘蛛池模板: 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 啤酒设备-小型啤酒设备-啤酒厂设备-济南中酿机械设备有限公司 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 学习虾-免费的学习资料下载平台| 华东师范大学在职研究生招生网_在职研究生招生联展网 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 淘趣英语网 - 在线英语学习,零基础英语学习网站| 儿童语言障碍训练-武汉优佳加感统文化发展有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 数控走心机-双主轴走心机厂家-南京建克 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 贵州成人高考网_贵州成考网| nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 氧化铁红厂家-淄博宗昂化工| 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 铣床|万能铣床|立式铣床|数控铣床|山东滕州万友机床有限公司 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 北京办公室装修,办公室设计,写字楼装修-北京金视觉装饰工程公司 北京成考网-北京成人高考网 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 山东艾德实业有限公司|