Вопрос по java – Повторное использование строк в Java?

9
String h = "hi";

здесь мы ссылаемся на строку h на строковый литерал hi. В JVM есть пул строковых литералов для хранения строковых литералов, поэтому мы можем повторно использовать строки, поскольку они неизменны ...

Когда мы говоримreusable, каков точный смысл этого? мы говорим оaddress ? что он выбирается с того же адреса каждый раз?

Я думаю, что ответ - да. Niklas B.

Ваш Ответ

4   ответа
8

String h = "hi";
String i = "hi";
String j = new String("hi");

В зависимости от версии JDK компиляторmay делать то, что называетсяinterning и создать один экземпляр байтовых данных, который представляет"hi" и повторно использовать его между ссылками на переменные. В самых последних спецификациях всестрокаliterals интернированы в пул строк в постоянном поколении.

С использованиемnew Ключевое слово, как в последнем утверждении создастnew instance точно таких же байтов как отдельный объект.

Строковые объекты, созданные вruntime являютсяnot в пуле строк, если.intern() называется на них.Это обычно не требуется и может вызвать проблемы, редко имеет какие-либо существенные преимущества.

h == i; // true
h == j; // false
j.intern();
h == j; // true
Error: User Rate Limit Exceeded nr5
Error: User Rate Limit Exceeded nr5
7

чтобы упростить ситуацию, вы можете думать об этом как о выборе с одного и того же адреса, но если быть более точным, переменные содержат одинаковыеreference - идентификатор, который JVM может использовать для сопоставления с соответствующим адресом памяти объекта (поскольку объекты могут перемещаться в памяти).

Вы можете проверить это по коду:

String w1 = "word";
String w2 = "word";
String b = new String("word"); // explicitly creating String by calling `new` operator 
                               // won't put it in string pool
System.out.println(w1 == w2);  // true  -> variables hold same reference
System.out.println(w1 == b);   // false -> variable hold different references
b = b.intern(); // check if pool contains this string, if not put this string in pool, 
                // then return reference of such string from pool and store it in b variable
System.out.println(w1 == b);   // true  -> now w1 and b hold same reference
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededb.intern()Error: User Rate Limit Exceededb=b.intern()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded nr5
Error: User Rate Limit Exceeded nr5
Error: User Rate Limit Exceeded nr5
4

private String h = "hi";

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

3

String буквальный пул внутри JVM со всемиStrings создаются в течение всей жизни программы. Под многоразовым подразумевается, что, когда вы хотите использовать другойString с точно такими же символами и кодировкой, новыйString объект не создан Вместо этого ссылка будет указывать на уже существующийString в пуле строк. Это называется интернированием.

Это может быть сделано, потому чтоStrings неизменны в Java.

Причина сделать что-то вроде этого состоит в том, чтобы избежать затрат на создание новогоString объект.

Посмотрите здесь для получения более подробной информации о том, что такое литеральный пул String и как он работает:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

Также посмотрите на этот вопрос:Разве я не должен делать `String s = new String (" новая строка ") на Java, даже с автоматическим интернированием строк?

Похожие вопросы