我的代码很小,如下所示
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\
为什么我在第一个字符串提供的输入与第二个字符串相同时得到两个不同的字符串。
答案 0 :(得分:11)
在运行时作为输入提供的控制台中的双反斜杠实际上是两个反斜杠。您只需编写两次ASCII字符反斜杠。
字符串文字中的双反斜杠意味着只有一个反斜杠。因为你不能在字符串文字中写一个反斜杠。为什么?因为反斜杠是一个特殊字符,用于“转义”特殊字符。例如:tab,换行符,反斜杠,双引号。如您所见,反斜杠也是需要转义的角色之一。你怎么逃脱?用反斜杠。因此,通过将反斜杠置于反斜杠中来逃避反斜杠。所以这导致两个反斜杠。 这将编译成一个反斜杠。
你为什么要逃避角色?看看这个字符串:this "is" a string
。如果你想在Java中将它写成字符串文字,你可能会故意认为它看起来像这样:
String str = "this "is" a string";
如您所见,这将无法编译。所以逃避它们就像这样:
String str = "this \"is\" a string";
现在,编译器知道"
没有关闭字符串但实际上意味着字符"
,因为你用反斜杠转义它。
答案 1 :(得分:2)
Java在第二个字符串
中使用\
作为转义字符
按需编辑
在第一种情况下,输入获取所有类型的字符并将它们封装在一个字符串中,因此所有字符都被打印出来(没有评估,因为它们被读取,它们被打印出来)。
在第二个中,JVM逐字符地评估"
之间的字符串,并且读取的第一个\
具有保护第二个字符的元字符,因此它不会被打印
答案 2 :(得分:2)
在字符串中\
是特殊字符,例如,您可以像\n
一样使用它来创建新的线条符号。要关闭其特殊含义,您需要使用其他\
,例如\\
。因此,在您的第二种情况下,\\
将被解释为一个\
字符。
如果您从外部源(如流)读取字符串,Java会假定它们是普通字符,因为特殊字符已经转换为例如制表符,新行字符等。
答案 3 :(得分:0)
字符串内部的char序列不能与双引号之间的char序列混淆,因为反斜杠具有特殊含义: “\ n \ r \ t \\\ 0”=> {(char)10,(char)13,(char)9,'\\',(char)0}