为什么在 Java 中使用 HashMap 会失败?

Why does this fail using HashMap In Java?

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 Whosebug 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 的注释代码有效。我真的不明白。记录值,它们匹配但检查失败说不同的值。

== 运算符比较两个对象引用。 Object 类型的 equals 方法做同样的事情,但一些 类 用新功能覆盖该方法。例如,"x" == "x" 如果它们是不同的对象,则有可能失败。 "x".equals("x") 为真。

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

希望这对您有所帮助?

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