Вопрос по java, string, object – Сколько объектов создается? [Дубликат]

0

На этот вопрос уже есть ответ:

Вопросы о пуле строк в Java 7 ответов

У меня был простой вопрос по поводу объединения экземпляров Stringz в Java

Если у меня такая ситуация: Сценарий 1:

String s1 = "aaa";  
String s2 = new String("aaa");  

а затем перевернул сценарий 2:

String s1 = new String("aaa");  
String s2 = "aaa";  

В каждом случае - сколько объектов создается в пуле и куче строк? Я предполагал, что оба создадут равное количество объектов (2 объекта - один «aaa» для обеих строк в каждом сценарии в пуле строк и один для нового оператора). В iview мне сказали, что это неправильно, мне любопытно, что не так с моим пониманием?

Что это за язык EdChum
Мне плохо - это на Яве !! Preator Darmatheon
На самом деле, это правильное объяснение: / Stackoverflow.com вопросы / 1881922 / ... evanwong

Ваш Ответ

2   ответа
1

как вы сказали в своем интервью.

Есть два пространства, где могут находиться строки: куча и perm gen, где хранятся интернированные строки.

Конструктор String создает строку в куче. Строковые литералы создаются в пуле строк в постоянном поколении. Строки в куче можно переместить в пул строк с помощью методаString.intern() который интернирует строку (то есть определяет ссылку на равную строку в пуле или создает там равную строку, если ее еще нет) и возвращает ссылку на интернированную строку.

EDIT: чтобы проверить, что я ответил, добавьтеSystem.out.println(s1 == s2); в качестве третьей строки для каждого примера. В обоих случаях будет напечатано значение false, доказывающее, что оба объекта имеют разные адреса памяти.

голосуй за хорошо объясненный ответ gifpif
1

"aaa" создается и объединяется при загрузке класса, поэтому при @ создается только одна новая стро две твои строки код выполняется.

Для ясности: оба примера создают только один новый объект String при выполнении. Литерал создается при первом использовании класса, содержащего строку «aaa».

class FooBar{
  void foo(){
    String s1 = "aaa";//the literal already exists  
    String s2 = new String("aaa");//creates string for s2 
  }
  void bar(){
    String s1 = new String("aaa"); //creates string for s1 
    String s2 = "aaa";//the literal already exists  
  }
}

class Test{

    public void main(String... args){
      ...
      //first time class FooBar used in program, class with literals loaded
      FooBar fb = new FooBar();
      //creates one string object, the literal is already loaded
      fb.bar();
      //also creates one string object, the literal is already loaded
      fb.foo();
    }
}
Вы можете быть технически правы, но не могли бы вы объяснить подробнее, что именно происходит в это время? Michael Schmeißer
Вы подразумеваете в обоих случаях? как сказал Майкл, не могли бы вы также уточнить? Preator Darmatheon

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