0

当我调用

System.out.println("print this line here");

是字符串

"print this line here"

实习?

String类有一个原生的实习机制,可以在值池中查找每个新的String值(除了那些通过其构造函数的显式调用实例化的值),并且只有在找不到该值时才创建该值的String对象在这个池子里。

我想知道这如何与字符串常量一起使用。因此,每次我在循环中调用此语句时,“在此处打印此行”是否被实习-在池中查找它是否存在...?

//=======================

注意:这与我的 prev.Q 相似但不同。

4

3 回答 3

1

Java 语言规范中的相关章节在这里。它指出

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

所以,是的,String文字"print this line here"是被实习的。

我想知道这如何与字符串常量一起使用。因此,每次我在循环中调用此语句时,“在此处打印此行”是否被实习-在池中查找它是否存在...?

不完全是,字节码有点不同。您将看到String将类的常量池中的对象的特定引用推入堆栈。

您可以在字节码中看到这一点

 public static void main(java.lang.String[]) throws java.lang.Exception;    Code:
      0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      3: ldc           #3                  // String print this line here
      5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      8: return

ldc 指令用于

将常量 #index 从常量池(String、int 或 float)推送到堆栈

该常量用于println()方法调用。

于 2013-11-12T02:35:06.247 回答
0

代码中的字符串文字被编译为类常量池的一部分。当类文件第一次加载时,它们被添加到字符串实习池中。到执行语句时,它只是从计算的常量地址加载实习字符串。

编辑:

如果你按照你的建议做:

String str = new String ("print this line here");

...那么您仍然有一个实习常量字符串,加上一个不 == 到实习生的新字符串。

于 2013-11-12T02:32:51.743 回答
0

String文字是编译时常量,默认为实习生。

于 2013-11-12T02:33:26.250 回答