久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

更新 Java HashMap 鍵

Updating Java HashMap key(更新 Java HashMap 鍵)
本文介紹了更新 Java HashMap 鍵的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我只是想知道,如果 HashMap 的鍵是可變的會發生什么,下面的測試程序證明了這一點,我無法理解 equals 和 hashCode 方法何時返回true 和相同的值,為什么 hashmap.containsKey 返回 false.

I was just wondering, what would happen if key of a HashMap is mutable, test program below demonstrate that and I am unable to understand when both equals and hashCode methods returns true and same value, why does hashmap.containsKey return false.

public class MutableKeyHashMap {

    public static void main(String []a){

            HashMap<Mutable, String> map = new HashMap<Mutable, String>();
            Mutable m1 = new Mutable(5);
            map.put(m1, "m1");
            Mutable m2 = new Mutable(5);
            System.out.println(map.containsKey(m2));    

            m2.setA(6);
            m1.setA(6);
            Mutable m3 = map.keySet().iterator().next();

            System.out.println(map.containsKey(m2)+"    "+m3.hashCode()+"       "+m2.hashCode()+"       "+m3.equals(m2));   

    }
}
class Mutable {

    int a;

    public Mutable(int a) {

        this.a = a;
    }

    @Override
    public boolean equals(Object obj) {

        Mutable m = (Mutable) obj;
        return m.a == this.a ? true : false; 
    }

    @Override
    public int hashCode(){
        return a;
    }

    public void setA(int a) {

        this.a = a;
    }

    public int getA() {
        return a;
    }
} 

這是輸出:

真假 6 6 真

推薦答案

javadoc 解釋它

注意:如果將可變對象用作映射鍵,則必須非常小心.如果對象的值以影響等于比較的方式更改,而對象是映射中的鍵,則不會指定映射的行為.

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

基本上,不要在 Map 中使用可變對象作為鍵,否則會被燒毀

Basically, don't use mutable objects as keys in a Map, you're going to get burnt

推斷,因為文檔可能看起來不清楚,我相信這里的相關點是以影響 equals 的方式更改",并且您似乎假設每次調用 contains 時都會調用 equals(Object).文檔沒有這么說,措辭暗示它們可能被允許緩存計算.

To extrapolate, because the docs may not appear clear, I believe the pertinent point here is `changed in a manner that affects equals', and you seem to be assuming that equals(Object) is called each time contains is invoked. The docs don't say that, the wording implies they may be allowed to cache computations.

查看source,似乎是因為您的hashCode 返回一個不同的值(以前是 5,現在是 6),可能是根據實現細節在不同的存儲桶中查找它.

Looking at the source, it seems that because your hashCode returns a different value (was 5, now 6), it's possible that it's being looked up in a different bucket based on implementation details.

這篇關于更新 Java 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屋-程序員
主站蜘蛛池模板: 国产免费一级片 | 九一精品| 羞羞的视频免费观看 | 欧美日韩中文在线观看 | 北条麻妃av一区二区三区 | 久久精品a级毛片 | 久久99精品久久久久久狂牛 | 超碰电影 | 欧美一区二区三区在线播放 | 欧美精品一区在线发布 | 一区二区三区高清 | 国产在线一区二区 | 中文在线播放 | 免费观看一级黄色录像 | 成人av高清| 日日夜夜精品视频 | a级在线免费观看 | 亚洲iv一区二区三区 | 超碰人人爱 | 欧美aⅴ | 日韩欧美在线不卡 | 狠狠综合久久av一区二区老牛 | 免费久久99精品国产婷婷六月 | 欧美色综合网 | 亚洲欧美日韩精品 | 黄网免费看 | 狠狠色综合网站久久久久久久 | 国产精品亚洲一区 | 国产精品国产精品国产专区不蜜 | 国产午夜精品久久久 | 自拍视频在线观看 | 久久久久久久久国产成人免费 | 久草在线在线精品观看 | 激情视频中文字幕 | 天天干天天谢 | h在线观看| 欧美激情久久久久久 | 亚洲天堂免费在线 | 亚洲国产免费 | 拍戏被cao翻了h承欢 | 日韩欧美一级精品久久 |