Строки JVM хранятся в памяти - PullRequest
4 голосов
/ 15 марта 2012

Какая разница (по памяти) между

private static final String FAILURE_MESSAGE=    "...";

protected String getFailedMsg() {
    return FAILURE_MESSAGE;
}

И

protected String getFailedMsg() {
    return "...";
}

Предполагается, что на FAILURE_MESSAGE ссылаются только из вышеуказанной функции.

Я имею в виду, где и как вышеупомянутые объекты / строки хранятся в памяти в вышеупомянутых случаях?Это специфическая JVM?

Редактировать: Я знаю, что строка интернирована в первом подходе, но где ее значение хранится / хранится / (интернируется?) Во втором подходе до вызова функции?

Второе редактирование как запоздалая мысль - что если строки заменить на int или какой-то другой класс, который не является строкой?

Ответы [ 5 ]

4 голосов
/ 15 марта 2012

Первый пример не компилируется, а второй пример.

Производительность обычно менее важна, чем простота и ясность, и у вас есть хороший пример этого. Если он скомпилируется, первый пример будет таким же быстрым, как и второй.

Кстати: не имеет значения, сколько раз и сколько классов используется строковый литерал, все они будут String.intern () , поэтому все они будут одним и тем же объектом. *

1 голос
/ 16 марта 2012

Сгенерированный байт-код одинаков в обоих случаях:

protected java.lang.String getFailedMsg()
    0 ldc 2 (java.lang.String) "..."
    2 areturn

, так что это чисто сахар.

1 голос
/ 15 марта 2012

Все строковые литералы будут интернированы, поэтому это не имеет никакого значения (в отношении памяти, глядя на экземпляр String).

Единственное отличие состоит в том, что в вашем первом случае класс содержит один ссылочный указатель на экземпляр String. Второй подход создает ссылку только на стек.

1 голос
/ 15 марта 2012

Строковые литералы ссылаются на один и тот же объект String, поэтому в этом случае нет различий в памяти.

Раздел 3.10.5 Строковые литералы JavaСпецификация языка 3.0 состояния:

Строковый литерал всегда ссылается на один и тот же экземпляр (§4.3.1) класса String ... [они «интернированы», чтобы обмениваться уникальнымиэкземпляры, используя метод String.intern.

0 голосов
/ 15 марта 2012

В обоих случаях он создает литерал в пуле строк. После создания String s = "...", если вы пытаетесь вернуть "..." в любом методе, оба указывают на один строковый литерал, созданный в пуле строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...