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

Java 字符串文本作为方法的参数,java,string,literals,Java,String,Literals,Java中的任何字符串文字都是String类型的常量对象,并存储在字符串文字池中 作为参数传递给方法的String文本是否也会存储在Stringliteral池中 比如我们写的时候, System.out.println("Hello"); 或 字符串“Hello”是否会被创建并存储在字符串文字池中 有没有办法打印字符串文本池的内容 作为参数传递给方法的字符串文本也会存储在字符串池中吗 当然。为什么您希望它们会有所不同?每当您在代码中使用字符串文字时(无论在何处),编译器将把该字符串放在符号表

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

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

比如我们写的时候,

System.out.println("Hello");

字符串
“Hello”是否会被创建并存储在
字符串
文字池中

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


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


当然。为什么您希望它们会有所不同?

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

以这个项目为例:

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
)。

至于检查字符串文字池,@Puneet似乎已经写入。

作为参数传递的字符串文字也是字符串文字,因此:是。为什么会有什么不同呢?这一切都发生在创建字符串时。不管以后它发生了什么(您对它做了什么),您可以使用
javap
命令打印出.class的符号表中的所有字符串文本。它将列出代码中使用的字符串文本。
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