【问题标题】:string literals as argument to methods字符串文字作为方法的参数
【发布时间】:2012-06-25 13:06:17
【问题描述】:

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

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

比如我们写的时候,

System.out.println("Hello");

anyobj.show("Hello");

会创建 String "Hello" 并将其存储在 String 文字池中吗?

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

【问题讨论】:

  • 作为参数传递的字符串文字也是字符串文字,所以:是的。为什么它们会有所不同?这一切都发生在创建字符串时。以后会发生什么(你用它做什么)并不重要。
  • 您可以使用javap 命令打印出.class 的符号表中的所有字符串文字。它将列出代码中使用的字符串文字。

标签: java string literals


【解决方案1】:

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

以这个程序为例:

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】:

    至于检查字符串文字池,@Puneet 似乎写了a tool for that

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多