什么是null字面值?

4
我已经编写了以下程序。
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",因为它们是完全不同的字符串。然而,输出结果让我感到惊讶。
This is x -  .
This is y -  .
false

如果这两个字符串不相等,那么它们如何产生相同的输出呢?

5
你的控制台可能无法显示正确的输出结果。 - AllTooSir
2
输出不一样。 - user1907906
1
因为那不是输出结果。 - m0skit0
4
这里没有发生过 http://ideone.com/wWEv2v。 - DrYap
你可能会发现这个(可能是一个谜题)代码很有趣。 - Lion
7个回答

11
如果这两个字符串不相等,那么它们怎么可能产生相同的输出结果呢?
它们只是在您的控制台上看起来相同而已!
如果您将控制台输出重定向到文件并使用十六进制转储工具进行检查,您可能会发现它们是不同的。(1)
顺便说一下,在Java中,“null”通常是指“空字面量”。您拥有的是一个字符串字面量...其唯一的字符是Unicode代码点“0x0000”。

1
@arshajii - 正如我所暗示的那样...这取决于他的控制台如何显示“NUL”字符。 - Stephen C
但它会显示为空格吗? - arshajii
1
@arshajii - OP说它确实可以...所以有证据表明在某些控制台上确实可以。 (而且这是微不足道的真实,因为有人会编写具有该行为的控制台程序。) - Stephen C
@arshajii 不要混淆空格和空白字符。如果控制台没有任何字符可显示(或仅为空“空”字符),它看起来与等宽字体中的空格相同。在非等宽字体中看到它的样子会很有趣。 - André Stannek

2

拥有相同的输出(光学上)并不意味着字符串由相同的字符组成。例如,制表符看起来与四个空格相同。在UTF-8中,有很多字符看起来完全相同,但实际上不同。

这也可能仅适用于您控制台上的表示。即使空字符应该看起来不同,您的控制台可能会错误地显示它。


请注意,这种情况下的输出甚至不应该看起来相同。 - arshajii
错误的答案。 \ 0 不是空格,它们不应该看起来相同。 - m0skit0

1
您的Java程序的实际输出是:
This is x - 
This is y -  .
false

编辑:请注意,这可能会非常依赖于操作系统和控制台,因为在许多技术中,\0是字符串终止符。


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控制台中还显示了一个空格。在文件中,控制字符是存在的。所以问题在于将一个无效的控制字符显示为一个空格。

如果你的控制台显示了一个退格空间,那么它是坏了的。另外,^G应该会哔哔地响。 - Ingo
1
@Ingo 谢谢 - 忘了。嘘,我想保持对 BEL,^G 的沉默。如果网页设计师听到了它... ;) 尽管 BEL 也显示为空格。 - Joop Eggen

0

尽管字符串不相等,以下代码如何产生相同的输出?

System.out.println("x\bA");
System.out.println("y\bA");
System.out.println("A");

0

尽管在控制台打印时它们看起来相同,但这些字符串并不相同。

在控制台打印会对字符串进行额外的处理(将字节转换为屏幕上的像素)。在您的情况下,它将\0字符转换为空格。

请查看DrYap发布的链接ideone.com/wWEv2v。他的输出与您的不同。


0

你所看到的是控制台应用程序的限制。在显示器上,二进制0看起来与空格字符相同。如果你想看到区别,你需要查看字符串的内存转储。


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