2014-12-10 3 views
2

Сколько объектов будет создано для фрагмента кода, показанного ниже?Сколько объектов будет создано для кода, показанного здесь?

String str1 = new String("nitesh"); 
String str2 = new String("nitesh"); 
String str3 = "nitesh"; 
String str4 = str3; 
String str5 = str2; 
+0

Пахнет домашней работой ??? – mastazi

+0

нет, его сложный вопрос: некоторые люди говорят, что 3 объекта и некоторые люди говорят 7 –

+0

@NiteshBagri Читайте это: http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal это должно помочь вы разбираетесь в том, что происходит в вашем коде. – azurefrog

ответ

0

3 Объекты (Неправильный ответ). «Ну, правильный номер, но неправильное объяснение».

String str1 = new String("nitesh"); // Creates a new String object 
String str2 = new String("nitesh"); // Creates a new String object 
String str3 = "nitesh";    // Creates a new String object 
String str4 = str3;     // Holds the same reference as str3 
String str5 = str2;     // Holds the same reference as str2 

Кажется, что третья строка не создает новый объект String, мой плохой.
Я поеду в IDE за это время.

Просто держите здесь ответ, ради конструктивных комментариев, следующих ниже.

Похоже верное объяснение для 3 объектов будет что-то вдоль линии ..

Первая строка создает 2 объекта, 1 в куче и 1 в Струнный бассейне?
Вторая строка создает 1 объект в куче.

+1

'String str3 =" nitesh ";' does ** not ** создать новый объект. –

+0

Действительно? Не являются ли новые String (...) и «...» действительными способами объявления строк? – Gosu

+0

, но для str1: 2 объекта будут созданы один в куче, а другой в пуле. пожалуйста, исправьте меня, если я ошибаюсь –

-2

Да 3 Объекты будут созданы.

1) String str1 = new String ("nitesh"); // Строковый объект «str1» создан

2) String str2 = new String ("nitesh"); // Строковый объект «str2» создан

3) String str3 = "nitesh"; // Создается строковый объект «str3»

String str4 = str3; // Не будет создан новый объект; Но будет удерживать значение «str3»

String str5 = str2; // Не будет создан новый объект; Но будет содержать значение "str2"

+0

Nonono ... 'str3' - это новая переменная, но не новый объект, созданный третьей строкой. – Amadan

+0

@ Амадан String - это класс на Java. Это не примитивная переменная типа в Java. Это объект. См. Также: https://docs.oracle.com/javase/tutorial/java/data/strings.html – gprathour

+0

@GPRathour Но третья строка ничего не создает. В первой строке первый «nitesh» создается как строковый литерал, а затем передается конструктору 'String'. На этом этапе были созданы два объекта. Позже в третьей строке «str3» присваивается значение строкового литерала, но объекты не создаются. см. [разность между строковым объектом и строковым литералом] (http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal). – azurefrog

-3
String str1=new String("nitesh"); 
    String str2=new String("nitesh"); 
    String str3="nitesh"; 
    String str4=str3; 
    String str5=str2; 

    System.out.println(str1.hashCode()); 
    System.out.println(str2.hashCode()); 
    System.out.println(str3.hashCode()); 
    System.out.println(str4.hashCode()); 
    System.out.println(str5.hashCode()); 

if (str1 == str2) 
     System.out.println("str1 == str2"); 

    if (str2== str3) 
     System.out.println("str2 == str3"); 

    if (str3== str4) 
     System.out.println("str3 == str4"); 

    if (str4== str5) 
     System.out.println("str4 == str5"); 

== испытания показывают, что str3 == STR4, так 3 объекты должны быть созданы для str1, ул 2 и Str3

+0

Добавить тесты для ==. Вы увидите, что некоторые из них не равны. – user949300

+1

Просто потому, что хеш двух строк с тем же значением не означает, что они являются одним и тем же объектом. – azurefrog

-2

На самом деле 2 объекта. str1 и str2 хранить ссылки на объекты. В то время как str3, str4 и str5 не содержат строковые объекты, а являются строковыми литералами.

В вашем примере str1 и str2 указывают на разные объекты в Java String Pool. Эти строки, если они будут мутированы, будут по-прежнему указывать на те же ячейки памяти, где они указывали, прежде чем их мутировать.
Хотя этот строковый объект нельзя напрямую мутировать с помощью оператора =, поскольку строки в java: неизменяемы, но объекты stringbuffer могут быть созданы с использованием строкового объекта, а затем этот объект буфера строк может быть мутирован с помощью методов в java.lang.StringBuffer класс.

Но если str3, str4 и/или str5 мутированы, т.е.если вы делаете это где-то в конце кода:

str3="narendra modi"; 

Новая ячейка памяти будет зарезервирован в java heap и не java string pool, со строкой «нарендра моди», хранящейся в нем, и str3 укажут на него. Пока str4 и str5 все равно будут указывать на место, где хранится строка «nitesh».

Цитирование добавил: струнные буферы могут мутировать ...

https://icl.googleusercontent.com/?lite_url=https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html&ei=25w3utEc&lc=en-IN

+0

Строки Java (объекты) ** неизменяемы **. Замечание останавливает вас от переназначения ссылочных переменных (если не объявлено как окончательный). –

+0

Да, они неизменны. То, что я имел в виду под моим ответом. Я ясно сказал, что они могут быть мутированы только методами. И jot напрямую –

+0

Строковые объекты ** не могут быть ** мутированы. Период. –

4
String str1 = new String("nitesh"); 
    String str2 = new String("nitesh"); 
    String str3 = "nitesh"; 
    String str4 = str3; 
    String str5 = str2; 

    TreeSet<Integer> set = new TreeSet<Integer>(); 

    set.add(System.identityHashCode(str1)); 
    set.add(System.identityHashCode(str2)); 
    set.add(System.identityHashCode(str3)); 
    set.add(System.identityHashCode(str4)); 
    set.add(System.identityHashCode(str5)); 

    System.out.println(set.size()); 

    // => 3 

три объекта являются:

  • "nitesh" создан во время компиляции
  • два различных объектов, созданных String конструктор.
+1

upvote. Спасибо за 'System.identityHashCode()' и точную причину. – gprathour

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