2012-01-25 2 views
5

я задал этот вопрос:Как Java обрабатывает объекты String в памяти?

String s = "abc"; // creates one String object and one 
      // reference variable 
In this simple case, "abc" will go in the pool and s will refer to it. 
String s = new String("abc"); // creates two objects, 
       // and one reference variable* 

На основании вышеизложенной информации, сколько строк объектов и сколько ссылок переменные были созданы до Println утверждения ниже коды?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

Мой ответ был Результат этого фрагмента кода весна зима весна лето

Есть две опорные переменные s1 и s2. Всего было создано восемь струнных объектов : «весна», «лето» (потеряно), «весеннее лето», «падение» (потеряно), «весна осень» (потеряна), «весенняя летняя весна», (потеряно), «зима» (потеряна), «весенняя зима» (в этот момент теряется «весна»).

В этом процессе не теряются только два из восьми объектов String.

Верно ли это?

+0

Что-то интересное: http://stackoverflow.com/questions/7663252/java-string-concat-in-stringbuilder-call/ Обратите внимание, что мой ответ на этот вопрос был неправильным ... – Gevorg

ответ

3

Ответ: 2 ссылки и 8 объектов

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already) 

String s2 = s1 + "summer "; //Two references and 3 objects 

s1.concat("fall "); //Two references and 5 objects 

s2.concat(s1); //Two references and 6 objects 

s1 += "winter "; //Two references and 8 objects 

System.out.println(s1 + " " + s2); 

Теперь ваш вопрос:.? Как объекты Java ручка строки в памяти

Java предоставляет два способа создания объекта класса String.

  1. Строка str1 = "OneString";

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

  1. String str1 = new String ("OneString");

Теперь JVM должен создать объект в куче. из-за . это не имеет значения, если OneString уже присутствует в пуле строк.

Вы также можете поместить строку в бассейн:

Вы можете позвонить стажер() на объекте String. Это поместит объект String в пул, если он еще не существует, и вернет ссылку на объединенную строку. (Если он уже был в пуле, он просто возвращает ссылку на объект, который уже был там).

Вы можете, как смотреть на следующие ссылки:

What is the Java string pool and how is "s" different from new String("s")?

Questions about Java's String pool

1

Выбрано слово. Это вопрос экзамена SCJP btw.

concat возвращает новую строку, это потеряно. Первый s1 перекрывается с «весенним зима»

Две вещи, которые вы должны знать о струнных Java:

  • Строки являются неизменяемыми (как уже объяснено вами)
  • Строки могут постоянно находиться в строке бассейн. Не каждый раз, когда вы пишете «Лето» совершенно новый String ist, неизменяемое «Лето» может выйти из пула (в зависимости от JVM, но для Oracle это так). Смотрите также: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern()

Приветствия христианские

+0

Не могли бы вы больше прокомментировать _Не каждый раз, когда вы пишете новый String («Лето») совершенно новый String ist built_? С помощью «нового» должен быть сконструирован ** новый объект java.lang.String ** (т. Е. Две строки не совпадают при сравнении их по ==). Однако эти два отдельных экземпляра String могут совместно использовать базовый массив char [] (при определенных условиях). –

+0

Да, я набрал быстро. Вы правы, объект String построен - я просто имел в виду, что самой «Строке» может не понадобиться больше памяти, потому что она находится в пуле строк. См. Также: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern() – Christian

1

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

Если вы конкатенацию или + на строки, то новая строка будет alloacted и данные compied вместе (с потерей производительности

В противоположность этому, создавая подстроку из строки практически бесплатно. - никакие данные не будут скопированы

1
String s = "abc"; // creates one String object and one 
       // reference variable 

Создает один строковый объект, только если объект не присутствует на строковой константе Бассейн уже ,

String s = new String("abc"); // creates two objects, 
           // and one reference variable* 

Это фактически создает только один объект в куче. Он добавляет этот объект в пул тогда и только тогда, когда метод intern() вызывается в этом объекте String.

String s1 = "spring "; 
String s2 = s1 + "summer ";   
s1.concat("fall ");   
s2.concat(s1);   
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

Вы объяснение кажется, нормально, за исключением того, у вас есть еще одна строка в System.out.println(). :-)
Когда вы говорите (потеряли) это на самом деле означает, что это не более живой объект (ссылка нет в стеке).

Смежные вопросы