【问题标题】:Collections - Long class hashcode vs Integer class hashcode集合 - 长类哈希码与整数类哈希码
【发布时间】:2019-05-03 20:57:18
【问题描述】:

我有下面的代码来检查不同对的总和是否等于一个数字。

static int numberOfPairs(int[] a, long k) {
                Integer
        Map<Integer,Integer> map = new HashMap<>();
        int count =0;
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++) {
                if(a[i]+a[j] == k){
                    if((!map.containsKey(a[i])) && (!map.containsKey(k-a[i]))) {
                        map.put(a[i], a[j]);
                        count++;
                    }
                }
            }
        }
        return count;
    }

containskey 方法不适用于上述代码 bcoz k 是 long 类型。但是如果我将 long 转换为 int,代码就可以工作。

static int numberOfPairs(int[] a, long k) {
                Integer
        Map<Integer,Integer> map = new HashMap<>();
        int count =0;
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++) {
                if(a[i]+a[j] == k){
                    int x=(int)k-a[i];
                    if((!map.containsKey(a[i])) && (!map.containsKey(x))) {
                        map.put(a[i], a[j]);
                        count++;
                    }
                }
            }
        }
        return count;
    }

问:为什么它不适用于 long 类型?containsKey 方法是如何工作的?

【问题讨论】:

    标签: java collections hashmap hashcode


    【解决方案1】:

    map.containsKey(k-a[i])

    这是检查Long 中是否存在Map&lt;Integer, Integer&gt;。这将始终为 false,即使数值恰好相同。

    请注意,long 需要装箱才能用作containsKey(Object key) 的参数,但它会自动装箱为Long,而不是Integer

    像 Findbugs 这样的静态代码检查器可能会就此向您发出警告。如果泛型更早地进入 Java,那么这里甚至可能是 the compile-time error you'd want

    map.containsKey((int)(k-a[i]))

    现在你有一个int,它会自动装箱到Integer,它可以工作了。

    【讨论】:

    • 对。但是, containsKey 会在什么基础上检查指定的键是否存在?根据我的理解,它会计算我们传递的对象的哈希码。这里我将密钥作为 2 传递(例如),然后每次我调用 containsKey(2) 我应该得到相同的哈希码对吗?那为什么不它工作吗?请澄清。
    • 它首先查看哈希码以找到对象应该位于的存储桶,但它仍然使用equals 比较在该存储桶中找到的对象(因为哈希码可能会发生冲突)。而 equals 在 Long 和 Integer 之间失败。
    猜你喜欢
    • 2011-02-25
    • 2012-09-16
    • 1970-01-01
    • 2012-03-25
    • 2012-11-13
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多