2013-06-10 3 views
0

Я действительно запутался в строке регулированием количестваСтрока Бассейн в JVM

, сколько объектов будет создавать в этой ситуации

String a=new String("Hi"); //1 
String b=new String("Hi"); //2 
String c="hi"; //3 

Если в случае 2-й и 3-й строке один объект создается, то почему она возвращается FALSE в случае (A == B) ....

+2

Это было задано так много раз прежде ... Например: http://stackoverflow.com/questions/10536670/how-many-string-objects-will-be-created-by-jvm-version- 1-6. У этого есть еще лучшие ответы: http://stackoverflow.com/questions/1881922/questions-about-javas-string-pool –

ответ

4

почему она возвращается FALSE в случае (A == B)

Потому что вы используете new String, тем самым получая новые ссылки на объекты для тех, String s.

Обратите внимание, что изменение кода

String a = "Hi"; //1 
String b = "Hi"; //2 

System.out.println(a == b); сделает печать true.

Дальнейшее объяснение: The String Pool

+0

@JoachimSauer right, сделал тест, чтобы проверить мое утверждение (запутался с пулом 'Integer'). Удалена эта часть ответа. –

1

Его не один объект, Вы создаете строк с использованием нового ключевого слова, так что JVM создает эти строки в Heap так как объекты адрес отличается.

И == проверить адрес объектов, почему он возвращает false.

и в случае строки c = "hi";

Это не создает новые, чтобы эти литералы создавались в String pool.and есть процесс интернирования jvm на этих литералах.

если есть еще одна строка d = "hi"; то c == d вернет true.

+0

Что такое compareTo в java String? Я не могу понять его вывод – Vikas

+0

compareTo - метод интерфейса Comparable, который реализуется String class.and используется для сравнения двух объектов. –

2

В Java для непримитивных типов оператор == сравнивает ссылки, а не значения.

Если вы создаете кучу эквивалентных Строковые литералы, как:

String sLit1 = "test"; 
String sLit2 = "test"; 

(sLit1 == sLit2) будет true, так как Java не выделяет новую память для каждой новой строки буквальным, он просто указывает на их все к тому же местоположение в памяти. Тем не менее, при создании строкового объекта:

String sObj = new String("test") 

Java всегда создает новый объект, который занимает новое место в памяти. Таким образом, sLit1 == sObj всегда будет false.

Это означает, что == дает true тогда и только тогда, когда два аргумента ссылаются на один и тот же объект. Чтобы сравнить строки, используйте метод equals, как в (sObj.equals(sLit1)).

+0

Thanx, но еще одна вещь, если я использую метод inturn(), он возвращает true в случае нового ключевого слова также – Vikas

+0

Здесь вы идете, [java.lang.String.intern()] (http: // stackoverflow. ком/вопросы/1091045/это-это хорошо-практика в использовании-ява-Ланг-строка-стажер). –

+0

Кроме того, поскольку вы также новый пользователь, вы должны проверить [тур] (http://stackoverflow.com/about). –

0

Здесь

String c = "Hi"; 

создаст строковый литерал в строковый литерал пул, который является отдельной памяти предусмотрено строковые литералы в Java. Когда вы пишете

String c = "Hi"; 
String d = "Hi"; 

Они относятся к тому же буквальным в строке постоянного пула. и == оператор проверяет, что ссылочные переменные относятся к одному и тому же объекту

Следовательно, c == d вернет true.