Java字符串类实习

Java字符串类实习,java,string,Java,String,当我调用 System.out.println("print this line here"); 这是绳子吗 "print this line here" 实习 类String有一个本机的内部机制,可以在值池中查找每个新的String值(通过其构造函数的显式调用实例化的值除外),并且仅当在该池中找不到该值时,才创建该值的String对象 我想知道这是如何处理字符串常量的。所以,每次我在循环中调用这条语句时,“在这里打印这行”是不是在实习——在池中查找它是否在那里 //============

当我调用

System.out.println("print this line here");
这是绳子吗

"print this line here"
实习

String有一个本机的内部机制,可以在值池中查找每个新的String值(通过其构造函数的显式调用实例化的值除外),并且仅当在该池中找不到该值时,才创建该值的String对象

我想知道这是如何处理字符串常量的。所以,每次我在循环中调用这条语句时,“在这里打印这行”是不是在实习——在池中查找它是否在那里

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


注意:这与我的上一个Q类似,但不同

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

编辑:

如果你按照你的建议去做:

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

。。。然后仍然有一个内部常量字符串,加上一个新字符串,该字符串不等于内部常量。

string
文本是编译时常量,默认为内部常量。

Java语言规范中的相关章节如下所示。它说

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

因此,是的,
字符串
文本
“在此处打印此行”
已插入

我想知道这是如何处理字符串常量的。所以,每次我 在循环中调用此语句时,是否使用“在此处打印此行” 实习--抬头看看游泳池里有没有

不完全是,字节码有点不同。您将看到对类的常量池中的
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

从常量池(字符串、int或float)推送常量#索引 上架


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

由于
String
对象是不可变的,所以所有字符串都是常量。只需不断重复文档中的内容即可。有什么意义?@PM77-1:不变,但不一定是实习<代码>“foo”!=新字符串(“foo”)@RussellZahniser-是的,我知道。只是要澄清一下——它不是每次都在执行过程中实习(?)不,它在类加载时实习一次。使用该字符串的指令只是从固定地址加载的。正确--对于编辑部分,顺便说一句,在快速编辑部分的参考中出错。移除它。