Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个字符串实例看起来相同,但它们的哈希代码不同_Java_String_Hashcode - Fatal编程技术网

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

Java 两个字符串实例看起来相同,但它们的哈希代码不同,java,string,hashcode,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"); } 输出: String a = "success"; S

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

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

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

    if(a.equals(b)){
        System.out.println("123");
    }
输出:

    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));
公共类比较{
公共静态void main(字符串参数[]){
字符串a=“成功”;
字符串b=“成功”;
char[]aChar=a.toCharArray();
char[]bChar=b.toCharArray();
对于(int i=0;i
第二个字符串的第一个字符是字符65279。你是从什么地方复制字符串的吗


字符串看起来相同,但不相同。再次尝试键入“success”文本,然后它就会工作。

当我将您的代码复制并粘贴到我的IDE中时,它显示b的开头双引号=“成功实际上是一个奇怪的双引号,而不是一个标准的双引号。Bizzarrele,我得到了与您相同的结果-代码编译和运行,但输出不同的哈希代码。通过使用普通双引号修复双引号,哈希代码现在是相同的。

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

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


这意味着
a
b
不相等,并且没有相同的哈希代码。

您确定哈希代码不同吗?发布您得到的输出。-1867169789和1954952228@DeanWhite-不可能。给我们看看你的完整代码。您使用的是
identityHashCode()
而不是
hashCode()
?String a=“success”;字符串b=“成功”;System.out.println(a.hashCode());System.out.println(b.hashCode());System.out.println(System.identityHashCode(a));System.out.println(System.identityHashCode(b));通过ideone.com运行代码会显示以下结果:
-1867169789-1867169789 2430287 2430287
-您期望得到什么?由于字符串不同,它们具有不同的哈希代码。复制的字符串以一个额外的隐藏字符开头(如上面的代码所示)。比较“成功”和“成功”这两个不相等的词也没什么不同。hashtag是一个不可见的字符,所以你看不到它,但它在那里。我想可能是这样的+1但如何摆脱这种情况?@Salman当然会删除不可见的字符;)如果您想自动摆脱这种情况,那么编写一个工具来遍历java源文件,并通过删除这些字符、通知用户存在这些字符或简单地用转义序列替换它们来识别和处理这些字符应该不会太难。在这个网站上已经有关于识别这类角色的问题了。
-1867169789
1954952228
33263331
6413875
public class Compare {


    public static void main(String args[])  {

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

        char[] aChar = a.toCharArray();
        char[] bChar = b.toCharArray();

        for(int i = 0; i < aChar.length; i++)
        {
            System.out.println((int)aChar[i]);
        }
        System.out.println("");
        for(int i = 0; i < bChar.length; i++)
        {
            System.out.println((int)bChar[i]);
        }
    }

}