两个字符串实例看起来一样,但它们的哈希码不同

Dea*_*ite 3 java string hashcode

    String a = "success";
    String b = "success";

    System.out.println(a.hashCode());
    System.out.println(b.hashCode());

    if(a.equals(b)){
        System.out.println("123");
    }
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这两个字符串有不同的哈希码。

    String a = "success";
    String b = "success";

    System.out.println(a.hashCode());
    System.out.println(b.hashCode());

    System.out.println(System.identityHashCode(a));
    System.out.println(System.identityHashCode(b));
Run Code Online (Sandbox Code Playgroud)

输出:

-1867169789
1954952228
33263331
6413875
Run Code Online (Sandbox Code Playgroud)

fab*_*ian 5

您已在第二个字符串的开头插入了零宽度不间断空格 (U+FEFF) 字符。

该字符串实际上等于以下字符串(没有隐藏的 unicode 字符): "\ufeffsuccess"

这意味着ab不相等并且没有相同的哈希码。