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

為什么 HashMap 調整大小以防發生碰撞或最壞的情

Why HashMap resize In case of collision or worst case(為什么 HashMap 調整大小以防發生碰撞或最壞的情況)
本文介紹了為什么 HashMap 調整大小以防發生碰撞或最壞的情況的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我只針對 1.7 之前的 java 版本提出這個問題.我正在使用反射來找出 HashMap 的當前容量.在下面的程序中,將 12 個唯一的人放入一個 HashMap 桶中(使用相同的哈希碼).然后我將第 13 個獨特的人放在相同或不同的存儲桶上(使用相同或不同的哈希碼).在這兩種情況下,添加第 13 個元素后,HashMap 都將大小調整為 32 個桶.我知道由于負載因子 0.75 和初始容量 16 HashMap 調整到其第 13 個元素的兩倍.但是仍然有可用的空桶,并且只有 2 個桶用于這第 13 個元素.

I am asking this question with respect to java version till 1.7 only. I am using reflection to find out current capacity of HashMap. In below program is putting 12 unique person into a single bucket of HashMap (using same hashcode). Then i am putting 13th unique person on same or different bucket(using same or different hashcodes). In both cases after adding this 13th element, HashMap resizes to 32 buckets. I understand that due to load factor .75 and initial capacity 16 HashMap resizes to its double with 13th element. But there are still empty buckets available and only 2 buckets are used for these 13th elements.

我的問題是:

  1. 我的理解是否正確.難道我沒有犯任何錯誤.這是 HashMap 的預期行為嗎?

  1. Is my understanding correct. Am I not making any mistake. Is this the expected behavior of HashMap?

如果所有這些都是正確的,那么即使有 12 或 11 個空閑桶,為什么在這種情況下需要將 HashMap 與第 13 個元素加倍.調整 HashMap 的大小不是額外的開銷或成本嗎?在這種情況下需要將 HashMap 加倍嗎?而根據 hashcode 可以將 13th 放入任何可用的桶中?

If all this is correct then even though there are 12 or 11 free buckets why the need to double the HashMap with 13th element in this case. Isn't it extra overhead or costly to resize the HashMap? What is the need to double the HashMap in this case While 13th can be put in any available bucket according to hashcode?

.

public class HashMapTest {
    public static void main(String[] args)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        HashMap<Person, String> hm = new HashMap<Person, String>();
        for (int i = 1; i <= 12; i++) {
            // 12 Entry in same bucket(linkedlist)
            hm.put(new Person(), "1");
        }
        System.out.println("Number of Buckets in HashMap : " + bucketCount(hm));
        System.out.println("Number of Entry in HashMap :  " + hm.size());
        System.out.println("**********************************");
        // 13th element in different bucket
        hm.put(new Person(2), "2");
        System.out.println("Number of Buckets in HashMap : " + bucketCount(hm));
        System.out.println("Number of Entry in HashMap :  " + hm.size());
    }

    public static int bucketCount(HashMap<Person, String> h)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        Field tableField = HashMap.class.getDeclaredField("table");
        tableField.setAccessible(true);
        Object[] table = (Object[]) tableField.get(h);
        return table == null ? 0 : table.length;
    }
}

class Person {
    int age = 0;

    Person() {
    }

    Person(int a) {
        age = a;
    }

    @Override
    public boolean equals(Object obj) {
        return false;
    }

    @Override
    public int hashCode() {
        if (age != 0) {
            return 1;
        } else {
            return age;
        }
    }
}

輸出

Number of Buckets in HashMap : 16
Number of Entry in HashMap :  12
**********************************
Number of Buckets in HashMap : 32
Number of Entry in HashMap :  13

推薦答案

  1. 是的,這是預期的行為.
  2. HashMap 并不關心使用了多少桶.它只知道已經達到負載因子,并且因此發生碰撞的概率變得太大,因此應該調整地圖的大小.盡管已經發生了許多碰撞,但調整地圖大小實際上可以解決這個問題.不是你的情況,因為你故意選擇了相同的 hashCode,但在更現實的情況下,hashCodes 應該有更好的分布.如果您故意選擇錯誤的 hashCodes,HashMap 無法做任何事情來提高自己的效率,并且增加復雜性來處理極端情況是沒有意義的,這種情況永遠不會發生,而且 HashMap 無論如何也無法修復.

這篇關于為什么 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屋-程序員
主站蜘蛛池模板: 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 大米加工设备|大米加工机械|碾米成套设备|大米加工成套设备-河南成立粮油机械有限公司 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 全国冰箱|空调|洗衣机|热水器|燃气灶维修服务平台-百修家电 | 工业制氮机_psa制氮机厂家-宏骁智能装备科技江苏有限公司 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 韦伯电梯有限公司 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 欧景装饰设计工程有限公司-无锡欧景装饰官网 | 精密光学实验平台-红外粉末压片机模具-天津博君 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 元拓建材集团官方网站| 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 合肥办公室装修 - 合肥工装公司 - 天思装饰 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 胃口福饺子加盟官网_新鲜现包饺子云吞加盟 - 【胃口福唯一官网】 |