Строковые литералы как аргумент методов

Любой литерал строки в Java является постоянным объектом типа String и сохраняется в пуле литералов String.

Будут ли литералы String переданы как аргументы в методы, которые также хранятся в литеральном пуле String?

Например, когда мы пишем,

System.out.println("Hello");

ИЛИ

anyobj.show("Hello");

будет создан и сохранен String "Hello" в литеральном пуле String?

Есть ли способ распечатать содержимое пула строковых литералов?

Ответы

Ответ 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

будут ли литералы String переданы в качестве аргументов в методы, которые также будут храниться в пуле строк?

Конечно. Почему вы ожидаете, что они будут другими?