java - Java 中 "abc"+ "de"和 "abc"+ de (de = "de") 之间的区别?

标签 java string

我运行以下代码并得到评论中显示的结果。我知道 ==.equals() 之间的区别。我不明白的是为什么我在第二行的代码与第三行的代码有不同的结果。

    String de = "de";
//  String abcde = "abc" + "de"; // abcde == "abcde" reture true
    String abcde = "abc" + de;   // abcde == "abcde" reture false;
    System.out.println();
    System.out.println(abcde=="abcde");
    System.out.println(de=="de");

在尝试对此进行调试时,我使用了 javap -c 命令并获得了第一个字符串连接的以下输出“代码”:

         Code:
 0:   ldc     #9; //String de
 2:   astore_1
 3:   new     #10; //class java/lang/StringBuilder
 6:   dup
 7:   invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V
 10:  ldc     #4; //String abc
 12:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang
 String;)Ljava/lang/StringBuilder;
 15:  aload_1
 16:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang
 String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #13; //Method java/lang/StringBuilder.toString:()Ljava/l
 ng/String;
   22:  astore_2
   23:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   26:  invokevirtual   #15; //Method java/io/PrintStream.println:()V
   29:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   32:  aload_2
   33:  ldc     #16; //String abcde
   35:  if_acmpne       42
   38:  iconst_1
   39:  goto    43
   42:  iconst_0
   43:  invokevirtual   #17; //Method java/io/PrintStream.println:(Z)V
   46:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   49:  aload_1
   50:  ldc     #9; //String de
   52:  if_acmpne       59
   55:  iconst_1
   56:  goto    60
   59:  iconst_0
   60:  invokevirtual   #17; //Method java/io/PrintStream.println:(Z)V
   63:  return

第二个字符串连接的输出:

我不太熟悉这个“代码”,也看不出存在这些差异的任何原因。那么谁能解释为什么会出现这些差异?

相关post

最佳答案

“问题”只是编译器对你来说太聪明了。当它看到 "abc"+ "de" 时,它会立即将其连接成文字 "abcde"。但是当它看到 "abc"+ de 时,不允许(根据 Java 规则)将其“优化”为文字,而是必须实现 + 函数,创建一个新的字符串对象。

字符串字面量总是作为驻留字符串处理,因此 == 将对它们起作用。

关于java - Java 中 "abc"+ "de"和 "abc"+ de (de = "de") 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24364465/

相关文章:

java - 打开文件时出现异常

java - 在矩形网格内单击鼠标添加球体

JAVA - SPARK - saveAsTextFile 无法应用于 '(java.lang.String, org.apache.hadoop.io.compress.CompressionCodec)'

PHP - 将字符串转换为 float

python - 用于字符串的 islower() - Python

java - 延迟抛出的异常以添加软断言

java - 在 Java 中创建一个充满随机整数的文本文件

java - 字符串的 NullPointerException

php - 在php中上传文件时 undefined variable

c++ - 在不使用字符串库中的任何内容的情况下将字符串值转换为 int