Java字符串比较

3

我在我的Java代码中有以下语句

System.out.println(cName+" "+pName+" "+cName.equals(pName));

输出结果为:

???????????????? ???????????????? false

equals方法应该返回true,因为这两个字符串具有相同数量的“?”。但我得到了false。

6
你的平台编码是什么?尝试将字符串转换为十六进制并比较其十六进制表示形式。 参考链接:https://dev59.com/zHNA5IYBdhLWcg3wh-YC - qwazer
6
正如 @popalka 指出的那样,? 经常被用来代替无法显示的字符,它并不一定是字符 ? - Hot Licks
该字符串由 ? 符号组成。 - user2133404
你手动声明了字符串等于“????????????????”吗? - user2494817
cName和pName在哪里定义的?你正在运行什么版本的Java/操作系统?如果定义了变量,它对我来说输出为true...String a = "????????????????"; String b = "????????????????";System.out.println(a + " " + b + " " + a.equals(b)); - Birgit Martinelle
显示剩余2条评论
2个回答

8
这两个“String”对象在控制台上的“打印”形式可能相同,但它们的内容肯定不相等,这一点可通过“String.equals()”方法的返回值证实。
它们很可能包含无法显示在控制台上的字符,因此控制台会以“?”字符代替“无法显示”的字符。
还有一种可能是,它们包含的字符在控制台上没有视觉效果。这些字符可能是零字符(‘\0’)和控制字符(其代码小于32),但这取决于控制台如何显示和显示什么内容。
请注意:即使您打开存储或初始化这些“String”对象的文件,并看到相同的问号,您的编辑器仍然可能无法显示字符,编辑器也会对无法显示的字符或没有视觉效果的字符显示问号(‘?’)。
如何显示差异?
遍历字符串的字符,并将它们作为int数字打印出来,你就会看到它们之间的区别。
String s = "Test";
for (int i = 0; i < s.length(); i++)
    System.out.println((int) s.charAt(i));

现在,如果您看到打印的相同数字,则可以确定它们是相同的,但是使用String.equals()将返回true

该字符串由?符号组成。没有特殊字符。 - user2133404
增加了另一种可能性:没有视觉外观的特殊字符(取决于控制台)。 - icza
零宽连字符和零宽非连接符,例如。 - David Conrad

0
可能是因为空格的原因,它会返回false
请检查这个:
System.out.println(cName+" "+pName+" "+(cName.trim()).equals(pName.trim()));

@NicePixel 因为我尝试了同样的事情,而且我得到了 true。 - Gautam Savaliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接