4

我有如下所示的小代码

public class Testing {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String firstString = sc.next();
        System.out.println("First String : " + firstString);
        String secondString = "text\\";
        System.out.println("Second String : " + secondString);
    }
}

当我以文本形式提供输入时,我得到的输出为

First String : text\\
Second String : text\

为什么当我提供给第一个字符串的输入与第二个字符串相同时我得到两个不同的字符串。

www.ideone.com 上的演示

4

4 回答 4

11

您在运行时作为输入提供的控制台中的双反斜杠实际上是两个反斜杠。您只需写两次 ASCII 字符反斜杠。

字符串文字中的双反斜杠意味着只有一个反斜杠。因为您不能在字符串文字中编写单个反斜杠。为什么?因为反斜杠是用于“转义”特殊字符的特殊字符。例如:制表符、换行符、反斜杠、双引号。如您所见,反斜杠也是需要转义的字符之一。你怎么逃脱?带反斜杠。因此,转义反斜杠是通过将其放在反斜杠后面来完成的。所以这会导致两个反斜杠。这将被编译成一个反斜杠。

为什么要转义字符?看看这个字符串:this "is" a string。如果您想在 Java 中将其写为字符串文字,您可能会故意认为它看起来像这样:

String str = "this "is" a string";

如您所见,这不会编译。所以像这样逃避他们:

String str = "this \"is\" a string";

现在,编译器知道 the"不会关闭字符串,而是真正表示 character ",因为您使用反斜杠对其进行了转义。

于 2012-07-15T15:07:57.113 回答
2

Java 使用\第二个字符串中的转义字符

按需编辑

  • 在第一种情况下,输入获取所有键入的字符并将它们封装在一个字符串中,因此所有字符都被打印(没有评估,因为它们被读取,它们被打印)。

  • 在第二个中,JVM"逐个字符地评估 之间的字符串,并且\读取的第一个具有保护第二个的元字符,因此不会打印。

于 2012-07-15T15:09:03.810 回答
2

在字符串\中是特殊字符,例如您可以像\n创建新行号一样使用它。要关闭它的特殊含义,您需要使用另一个\like \\。所以在你的第二种情况下\\将被解释为一个\字符。

如果您从外部源(如流)读取字符串,Java 假定它们是普通字符,因为特殊字符已经转换为例如制表符、换行符等。

于 2012-07-15T15:18:06.857 回答
0

字符串内部的 char 序列不能与双引号之间的 char 序列特别混淆,因为反斜杠具有特殊含义:"\n\r\t\\\0" => { (char)10,(char)13, (char)9,'\\',(char)0 }

于 2012-07-15T15:14:26.410 回答