16

Java 中的任何 String 文字都是类型的常量对象,String并存储在 String 文字池中。

String作为参数传递给方法的文字是否也会存储在文字String池中?

比如我们写的时候,

System.out.println("Hello");

或者

anyobj.show("Hello");

会创建一个String“Hello”并将其存储在String文字池中吗?

有没有办法打印字符串文字池的内容?

4

3 回答 3

22

每次在代码中使用字符串文字时(无论在哪里),编译器都会将该字符串放在符号表中,并在每次在同一文件中的某处遇到相同字符串时引用它。稍后这个字符串将被放置在常量池中。如果将该字符串传递给另一个方法,它仍然使用相同的引用。字符串是不可变的,因此重用它们是安全的。

以这个程序为例:

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

常量池中有两个条目:一个 for String( #2) 引用实际字符 ( #19)。

于 2012-06-23T12:54:21.783 回答
5

作为参数传递给方法的字符串文字也会存储在字符串池中吗?

当然。为什么你会期望它们有所不同?

于 2012-06-23T12:53:13.423 回答
1

至于检查字符串文字池,@Puneet 似乎为此编写了一个工具

于 2012-06-23T12:57:43.667 回答