方法参数中的字符串字面量

16

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

作为参数传递给方法的String字面值也会被存储在String字面值池中吗?

例如,当我们编写以下代码时:

System.out.println("Hello");

或者

anyobj.show("Hello");

在字符串常量池中,是否会创建并存储字符串“Hello”?

有没有办法打印出字符串常量池的内容?


3
作为字符串字面值传递的参数也是字符串字面值,所以答案是:是的。它们有什么不同呢?这一切都发生在字符串被创建时。无论之后发生了什么(你对它做什么),都没有关系。 - Thilo
2
您可以使用javap命令打印出.class文件中符号表中的所有字符串字面量。它将列出代码中使用的字符串字面量。 - nhahtdh
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

常量池中有两个条目:一个是字符串(#2),它引用了实际的字符(#19)。


5
传递给方法的字符串文字也会存储在字符串池中吗?当然会。你为什么会期望它们有任何不同呢?

1

关于检查字符串文字池,@Puneet似乎已经编写了一个工具


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接