首页 > 解决方案 > 集合 - 长类哈希码与整数类哈希码

问题描述

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

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;
    }

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

标签: javacollectionshashmaphashcode

解决方案


map.containsKey(ka[i])

这是检查 aLong中是否存在Map<Integer, Integer>。即使数值恰好相同,这也总是错误的。

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

像 Findbugs 这样的静态代码检查器可能会给你一个警告。如果泛型更早地进入 Java,这甚至可能是您想要的编译时错误

map.containsKey((int)(ka[i]))

现在你有一个int,它将自动装箱为 anInteger并且它可以工作。


推荐阅读