Java 常量池中两个字符串的引用id
访问 O/p:错误Java 常量池中两个字符串的引用id,java,Java,访问 O/p:错误 应为O/p:True您不能使用==来比较两个字符串,因为==运算符断言s1和s2指向相同的内存位置,而不是内容相等。要比较两个字符串的内容以查看它们是否包含相同的内容,请使用字符串的.equals()方法。另外,在s1=s1+行上还需要额外的空间 代码: 如果要使用==,则必须使用以下命令: public class StringLiterals { public static void main(String[] args) { String s1 = "T
应为O/p:True您不能使用==来比较两个字符串,因为==运算符断言s1和s2指向相同的内存位置,而不是内容相等。要比较两个字符串的内容以查看它们是否包含相同的内容,请使用字符串的
.equals()
方法。另外,在s1=s1+
行上还需要额外的空间
代码:
如果要使用==,则必须使用以下命令:
public class StringLiterals
{
public static void main(String[] args)
{
String s1 = "This is my book";
String s2 = s1;
System.out.println(s1 == s2);
}
}
因为字符串是对象,所以它们的==行为与int、char和其他原语不同。这可能有助于澄清问题
String s1 = "This is";
s1 = s1 + " my book"; // Note the space
String s2 = "This is my book";
String s3 = "This is my book";
System.out.println(s1==s2); // False
System.out.println(s2==s3); // True
“字符串仅在显式插入或通过类使用文本插入时才放入池中。”因此,不能将字符串与+运算符连接起来,并期望将其放入字符串常量池。存在+运算符会产生新字符串。在这里,
s1=s1+“我的书”
,s1+“我的书”隐式创建新字符串并存储对s1的引用。所以它不同于s2首先,您缺少一个空格。我想那只是个错误
你可能见过这样的情况:
"This is"+" my book" == "This is my book"
为什么会这样?因为都是编译时常量。特别是“字符串类型的文本”和“加法运算符+和-”
还有“引用常量变量的简单名称[…]”。但这不适用,因为您的变量不是final
但这不是你特别需要知道的事情。只需对
字符串s使用equals
。您的代码编译成
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String This is
2: astore_1
3: new #18 // class java/lang/StringBuilder
6: dup
7: aload_1
8: invokestatic #20 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
11: invokespecial #26 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: ldc #29 // String my book
16: invokevirtual #31 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #35 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: ldc #39 // String This is my book
25: astore_2
26: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_1
30: aload_2
31: if_acmpne 38
34: iconst_1
35: goto 39
38: iconst_0
39: invokevirtual #47 // Method java/io/PrintStream.println:(Z)V
42: return
因为
s1=s1+"my book";
不是一个常量表达式-您正在读取一个变量的值,编译器将假定您可以同时更改它。如果你想要的话
由常量表达式(§15.28)计算的字符串在编译时计算,然后将其视为文本
适用于您必须将代码更改为
public static void main(String[] args) {
String s1 = "This is " + "my book";
String s2 = "This is my book";
System.out.println(s1 == s2);
}
或
现在你可以保证它是有效的。第二个示例编译为
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String This is
2: astore_1
3: ldc #18 // String my book
5: astore_2
6: ldc #20 // String This is my book
8: astore_3
9: ldc #20 // String This is my book
11: astore 4
13: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
16: aload_3
17: aload 4
19: if_acmpne 26
22: iconst_1
23: goto 27
26: iconst_0
27: invokevirtual #28 // Method java/io/PrintStream.println:(Z)V
30: return
正如你所看到的,加载2次String#20
“这是”+“我的书”
首先是“这是我的书”
,它缺少一个空格,因此无论你如何比较它都不相等。“这是”+“我的书”也给出false。提供链接后,你真的应该写一个实际的问题来澄清所有这些已经引起的混乱。他希望它们在同一个内存位置。编译器将字符串和intern连接起来,然后就可以工作了。我修改了我的答案,以显示同时使用.equals()和==,两者都返回true的方法。我认为这与隐式OP问题无关。您修改的答案虽然正确,但没有解决OP的问题。我们开始吧!访问链接的人!不完全正确。连接两个常数将得到一个常数。@TomHawtin-tackline您能更好地解释一下吗?
s1=s1+"my book";
public static void main(String[] args) {
String s1 = "This is " + "my book";
String s2 = "This is my book";
System.out.println(s1 == s2);
}
public static void main(String[] args) {
final String s1a = "This is ";
final String s1b = "my book";
String s1 = s1a + s1b;
String s2 = "This is my book";
System.out.println(s1 == s2);
}
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String This is
2: astore_1
3: ldc #18 // String my book
5: astore_2
6: ldc #20 // String This is my book
8: astore_3
9: ldc #20 // String This is my book
11: astore 4
13: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
16: aload_3
17: aload 4
19: if_acmpne 26
22: iconst_1
23: goto 27
26: iconst_0
27: invokevirtual #28 // Method java/io/PrintStream.println:(Z)V
30: return