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屋-程序員
主站蜘蛛池模板: 广东之窗网| 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | 北京开源多邦科技发展有限公司官网| 裹包机|裹膜机|缠膜机|绕膜机-上海晏陵智能设备有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 凝胶成像系统(wb成像系统)百科-上海嘉鹏 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 顺辉瓷砖-大国品牌-中国顺辉 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 查分易-成绩发送平台官网 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | CPSE安博会| 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 中宏网-今日新闻-财经新闻| 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 |