【问题标题】:Why does this fail using HashMap In Java? [duplicate]为什么在 Java 中使用 HashMap 会失败? [复制]
【发布时间】:2020-02-18 20:32:25
【问题描述】:
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {

        //Use inputs from https://pastebin.com/DMQ6xqKe and assign to s * t, as stackoverflow limited character use
        String s = "";
        String t = "";

        System.out.println(isAnagram(s, t));
    }

    public static boolean isAnagram(String s, String t) {
        HashMap<Character, Integer> sMap = new HashMap<>();
        HashMap<Character, Integer> tMap = new HashMap<>();

        if(s.length() != t.length())
        {
            return false;
        }

        for(int i = 0; i < s.length(); i++)
        {
            if(sMap.containsKey(s.charAt(i)))
            {
                sMap.replace(s.charAt(i), sMap.get(s.charAt(i)) + 1);
            }
            else
            {
                sMap.put(s.charAt(i), 1);
            }
        }

        for(int i = 0; i < t.length(); i++)
        {
            if(tMap.containsKey(t.charAt(i)))
            {
                tMap.replace(t.charAt(i), tMap.get(t.charAt(i)) + 1);
            }
            else
            {
                tMap.put(t.charAt(i), 1);
            }
        }

        //FAILS BUT WHY!?!??!?
        for(int i = 0; i < s.length(); i++)
        {
            System.out.println("outside " + sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
            if(sMap.get(s.charAt(i)) != tMap.get(s.charAt(i)))
            {
                System.out.println(sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
                return false;
            }
        }

        //PASSES BUT PREVIOUS FAILS?!!?!??!
        // if(!sMap.equals(tMap))
        // {
        //     return false;
        // }

        return true;
    }
}

此代码失败,但使用 .equals 的注释代码有效。我真的不明白。记录了值,它们匹配但检查失败,显示不同的值。

【问题讨论】:

  • 尝试将if(sMap.get(s.charAt(i)) != tMap.get(s.charAt(i)))更改为if (!sMap.get(s.charAt(i)).equals(tMap.get(s.charAt(i))))

标签: java replace java-8 hashmap equals


【解决方案1】:

== 运算符比较两个对象引用。 Object 类型的 equals 方法的作用相同,但某些类使用新功能覆盖了该方法。例如,“x” == “x” 如果它们是不同的对象,则它们可能会失败。 "x".equals("x") 是真的。

String x = "@";
String y = x;
x == y; // true, its the same reference.

希望这有帮助吗?

【讨论】:

  • “可能失败” - 明确一点,如果它们是不同的对象,它总是会失败。
  • 请注意,您的字符串示例不是特别好,因为 "x" == "x" 也必须是 true,这是由于 Java 必须根据 JLS 支持的字符串暂留(缓存、字符串池)。
  • 我想;这更像是我试图传达的一般想法。
【解决方案2】:

是因为HashMap中实现了equals方法。在这个实现中 如果第一个映射中的每个 (key, value) 对等于第二个映射中的 (key, value) 对,则两个映射相等。在这个实现中,如果两个键引用同一个对象并且两个值引用同一个对象,则两个键值对相等。在这里,因为您的地图可能包含相同的键、值,但在不同的对象中它们不相等。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2016-03-16
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2023-03-29
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多