Java中的任何String文字都是String
类型的常量对象,并存储在String文字池中。
作为方法的参数传递的String
文字是否也会存储在String
文字池中?
例如,当我们写作时,
System.out.println("Hello");
OR
anyobj.show("Hello");
是否会创建String
“Hello”并存储在String
文字池中?
有没有办法打印String文字池的内容?
答案 0 :(得分:20)
每次在代码中使用String文字时(无论在哪里),编译器都会将该字符串放在符号表中,并在每次遇到同一文件中的相同字符串时引用它。稍后此字符串将放在常量池中。如果将该字符串传递给另一个方法,它仍然使用相同的引用。字符串是不可变的,因此重用它们是安全的。
以此程序为例:
public class Test {
public void foo() {
bar("Bar");
}
public void bar(String s) {
System.out.println(s.equals("Bar"));
}
}
使用javap -c -verbose
反编译后,您会发现以下内容:
const #2 = String #19; // Bar
//...
const #19 = Asciz Bar;
public void foo();
//...
1: ldc #2; //String Bar
public void bar(java.lang.String);
//...
4: ldc #2; //String Bar
常量池中有两个条目:一个用于String
(#2
)引用实际字符(#19
)。
答案 1 :(得分:5)
将作为参数传递给方法的字符串文字也存储在字符串池中吗?
当然。你为什么期望它们有任何不同?
答案 2 :(得分:1)
至于检查String文字池,@ Puneet似乎写了a tool for that。