集合-Long类哈希码与Integer类哈希码

时间:2018-12-02 09:21:38

标签: java collections hashmap hashcode

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

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:为什么它不能用于长类型?containsKey方法如何工作?

1 个答案:

答案 0 :(得分:1)

  

map.containsKey(k-a [i])

这正在检查Long中是否存在Map<Integer, Integer>。即使数值恰好相同,也始终为假。

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

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

  

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

现在您有一个int,它将自动装箱到Integer,并且可以使用。