反斜杠(\)的行为不同

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);
    }
}

当我提供输入作为 text\\ 时,我会得到输出。
First String : text\\
Second String : text\

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

在www.ideone.com上查看演示


在Java中,\\是转义字符。 - redDevil
4个回答

11
在您提供的控制台输入中,双反斜杠实际上是两个反斜杠。您只是两次写入ASCII字符反斜杠。
字符串文字中的双反斜杠表示一个反斜杠。因为您无法在字符串文字中编写单个反斜杠。为什么?因为反斜杠是用于“转义”特殊字符的特殊字符。例如:制表符、换行符、反斜杠和双引号。正如您所看到的,反斜杠也是需要转义的字符之一。那么该怎么转义呢?使用反斜杠进行转义。因此,通过将其置于反斜杠后面来转义反斜杠。这样就会得到两个反斜杠。这会编译成一个反斜杠。
为什么必须转义字符?看看这个字符串:this "is" a string。如果您要在Java中将其作为字符串文字编写,您可能故意认为它应该像这样:
String str = "this "is" a string";

正如您所看到的,这段代码无法编译。因此,请通过以下方式对它们进行转义:

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

目前,编译器知道"并不是字符串的结束符,而是代表字符",因为你用反斜杠对其进行了转义。


2

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

按需编辑

  • 在第一种情况下,输入将所有键入的字符封装在一个字符串中,因此所有字符都会被打印出来(不进行计算,读取时即打印)。

  • 在第二种情况下,JVM逐个评估位于"之间的字符串,并将第一个\读取为元字符来保护第二个字符,因此它不会被打印出来。


我知道...那么我的问题是为什么不在第一种情况下呢? - Fahim Parkar
在第一个案例中,输入会获取所有键入的字符并将它们封装在一个字符串中,因此所有字符都会被打印出来;在第二个案例中,JVM必须评估"之间的字符串,并且第一个\被解释为元字符以保护第二个字符。 - cl-r

2

在字符串中,\ 是一个特殊字符,例如你可以使用 \n 来创建新行符号。为了取消它的特殊含义,你需要再使用另一个 \,如 \\。因此,在第二个例子中,\\ 将被解读为一个 \ 字符。

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


0

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


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