我写了以下程序。
public class StringTest {
public static void main(String[] args){
String x = "\0";
String y = " ";
System.out.println("This is x - "+x+".");
System.out.println("This is y - "+y+".");
System.out.println(x.equals(y));
}
}
当然,x.equals(y)
应该明显是false
,因为它们完全不同String
。然而,输出让我感到惊讶。
This is x - .
This is y - .
false
如果这两个String
不相等,那么他们怎么能产生相同的输出?
答案 0 :(得分:11)
如果这两个字符串不相等,那么他们怎么能产生相同的输出?
他们只是看起来就像你的控制台上的相同输出一样!
如果将控制台输出重定向到文件并使用十六进制转储工具进行检查,则可能 1 发现它们不同。
1 - 我们无法确定。在平台的默认字符集中编码字符的过程也可能是将NUL映射到SP。但是十六进制转储将澄清这一点。
顺便说一下,null
是Java中“null literal”的正常含义。你拥有的是String
文字......其唯一的字符是Unicode代码点0x0000
。
答案 1 :(得分:2)
具有相同的输出(光学)并不意味着该字符串由相同的字符组成。例如。选项卡看起来与四个空格相同。在UTF-8中,有很多字符看起来完全相同但不是。
这也可能只适用于控制台上的表示。即使空字符的外观不同,您的控制台也可能显示错误。
答案 2 :(得分:1)
Java程序的实际输出是
This is x -
This is y - .
false
编辑:请注意,这可能非常依赖操作系统和控制台,因为\ 0是很多技术中的字符串终结符。
答案 3 :(得分:1)
我为32个控制字符+空格做了这个:
try (PrintWriter out = new PrintWriter("C:/ctl.txt")) {
for (int i = 0; i <= 32; ++i) {
String s = "" + (char)i;
System.out.println("(char)" + i + " is '" + s + "'.");
out.println("(char)" + i + " is '" + s + "'.");
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
除了退格键,制表符,换行符和回车符之外,IDE控制台显示了一个空格。在档案中,控制人员就在那里。因此,需要向空间显示非功能性控制字符。
答案 4 :(得分:0)
Stings不一样,即使它们在打印到控制台时看起来一样。
打印到控制台会对字符串添加其他处理。 (将字节转换为屏幕上的像素)。在您的情况下,它将\ 0字符转换为空格。
查看DrYap发布的链接,ideone.com / wWEv2v。他的输出与你的输出看起来不一样。
答案 5 :(得分:0)
您看到的是控制台应用的限制。二进制0看起来与显示屏上的空格字符相同。如果要查看差异,则必须查看字符串的内存转储。
答案 6 :(得分:0)
尽管字符串不相等,但以下如何产生相同的输出?
System.out.println("x\bA");
System.out.println("y\bA");
System.out.println("A");