字符串文本作为方法的参数

2022-09-03 05:23:29

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

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

例如,当我们写,

System.out.println("Hello");

anyobj.show("Hello");

是否会创建“Hello”并将其存储在文本池中?StringString

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


答案 1

每次在代码中使用 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


答案 2

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

答案是肯定的。你为什么期望它们会有所不同?