0

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

This question already has an answer here:

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

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

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

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

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

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

  • голосовать за хорошо объясненный ответ

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

    от Preator Darmatheon
  • Вы можете быть технически правы, но не могли бы вы объяснить более подробно, что именно происходит в какое время?

    от
  • На самом деле, это правильное объяснение:stackoverflow.com/questions/1881922/…

    от evanwong
  • Мой плохой - это на Яве !!

    от Preator Darmatheon
  • какой это язык?

    от EdChum
  • 1

    Струна для буквального

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

    Для ясности: оба примера создают только один новый объект 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();
        }
    }
    

  • 1

    Ответ - 1 экземпляр в куче и 1 в пуле строк в любом случае

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

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

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

    РЕДАКТИРОВАТЬ: Чтобы проверить, что я ответил, добавьтеSystem.out.println(s1 == s2); в качестве третьей строки для каждого примера. В обоих случаях будет напечатано false, доказывая, что оба объекта имеют разные адреса памяти.