Java 常量池中两个字符串的引用id

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:错误


应为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