【问题标题】:Is calling intValue() method required when getting an Integer value from Java HashMap?从 Java HashMap 获取 Integer 值时是否需要调用 intValue() 方法?
【发布时间】:2019-08-31 22:09:37
【问题描述】:

我有一个 HashMap 声明为: Map<Character, Integer> dict = new HashMap<Character, Integer>(); 在某处的代码中,我从上面的地图中获取整数值作为字符。我观察到如果在获取 Integer 值时不添加 .intValue() 方法,代码将终止而没有任何错误,如果我将 intValue() 放在 ** 标记的区域中,它工作正常。

下面是完整的代码:

class Solution {
    public String minWindow(String s, String t) {
        int l =0, r = 0;
        Map<Character, Integer> dict = new HashMap<Character, Integer>();

        for(int i = 0; i < t.length(); i++){
            int count = dict.getOrDefault(t.charAt(i), 0);
            dict.put(t.charAt(i), count + 1);
        }

        int formed = 0;
        int required = dict.size();
        Map<Character, Integer> window = new HashMap<Character, Integer>();

        int[] ans = {-1, 0, 0};

        while(r < s.length()){
            char c = s.charAt(r);
            int count = window.getOrDefault(c, 0);
            window.put(c, count + 1);
            **if(dict.containsKey(c) && dict.get(c) == window.get(c)){
                formed++;
            }**
            while(l <= r && formed == required){
                if(ans[0] == -1 || r - l + 1 < ans[0]){
                    ans[0] = r - l + 1;
                    ans[1] = l;
                    ans[2] = r;
                }
                window.put(s.charAt(l), window.get(s.charAt(l)) - 1);
                if(dict.containsKey(s.charAt(l)) && window.get(s.charAt(l)) < dict.get(s.charAt(l))){
                    formed--;
                }
                l++;
            }
            r++;
        }
        return ans[0] != -1 ? s.substring(ans[1], ans[2] + 1) : "";

    }
    public static void main(String[] args){
        Solution s = new Soultion();
        String ret = s.minwindow("ABCDEF", "BCD");
        System.out.print(ret);
    }
}

【问题讨论】:

    标签: java hashmap integer autoboxing


    【解决方案1】:

    dict.get(c) == window.get(c) 是您比较int(s) 的方式;不幸的是,您正在比较Integer(s)。调用intValue 来强制进行原始相等比较是一种选择。另一个是dict.get(c).equals(window.get(c))

    【讨论】:

    • 会做类似dict.get(c) - window.get(c) == 0的操作吗?
    • @MihirKekkar:会的。但是,为什么要使用表现不佳的拆箱来解决高效的 equals() 呢?
    • @ChristianH.Kuhn 有趣,我不知道拆箱的性能时间很差。
    • 但是即使我比较整数,比较也会自动发生在未装箱的int(s) 之间,对吧?为什么代码会终止?为什么像下面这样的代码有效而不是上面的代码:Integer a = 5; Integer b = 6; if(a == b) { System.out.println("Yes"); } else { System.out.println("No"); } 我想这两个条件都是一样的。如果我遗漏了什么,请告诉我。
    • @Pankaj 并没有那么琐碎的Integer a = 1000; Integer b = 1000; System.out.print(a == b); 也会输出false(通常只有256 个整数(-128 到127 左右)被缓存;对于其他人,必须创建一个新实例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多