2013-10-06 4 views
0

Я новичок в программировании JAVA. Я прочитал это в моей книгеоператор присваивания Строковый объект

String a="Hello"; 
String b="Hello"; 
System.out.println(a==b); 

Это должно вернуть ложное как & б относятся к различным экземплярам объектов String.

Bcoz оператор присваивания сравнивает экземпляры объектов, но все же я получаю true.
Я использую Eclipse IDE.

Пример в книге идет как это:

String s = "s"; 
String sToo = "s"; 
System.out.println(a == b); 
System.out.println(s == sToo); 

Этот бит кода выводит «ложных» для s == Stoo. Это потому, что s и sToo являются ссылками на разные экземпляры объекта String. Таким образом, хотя они имеют одинаковое значение, они равны , не равным в глазах операторов равенства. Кроме того, s == "s" печатает false, потому что строковый литерал создает еще один экземпляр класса String.

Название книги: JAVA 7 для Absolute Beginners

+6

Нет, значения 'a' и' b' относятся к одному и тому же объекту из-за интернирования строк. Вы уверены, что книга дает точный пример? Также обратите внимание, что оператор * присваивания * вообще не выполняет сравнения. Оператор присваивания равен '='; возможно, вы думали об операторе равенства, '=='? –

+2

Чтобы увидеть, как он может вернуть false, попробуйте 'String a = new String (« Hello »); String b = "Hello"; ' – Flavio

+0

Извините, действительно сделал тип. Думал о назначении оператора. Очень жаль –

ответ

7

Это оптимизация называется string pooling, в котором во время компиляции константных строк (ака известно, идентичны во время компиляции) могут быть установлены таким образом, что они на самом деле один и тот же объект в памяти (сохранение места для одного из наиболее используемых типов объектов). Или в словах docs;

«Все литералы и строковые константные выражения: интернированных».

Обратите внимание, что это применимо только к строкам, которые определены во время компиляции, поэтому следующее действительно будет печатать false.

String a="Hello"; 
String b=new String("Hello"); 
System.out.println(a==b); //prints false because a new string was forced 

или

String a="Hello"; 
String b1="He"; 
String b2="llo"; 
String b=b1+b2; 

System.out.println(a==b); //prints false because b wasn't know to be "Hello" at compile time so could not use string pooling 

нотабене Можно заставить второй фрагмент напечатать true, сделав окончание b1 и b2 окончательным, позволяя знать b1 + b2 во время компиляции. В целом вам нужно быть очень осторожным и обрабатывать строку == строка со значительным уважением, в подавляющем большинстве случаев вам требуется string.equals (string), в котором этого поведения не существует.

+0

Так что сэр что это показывает - книга Пример правильный или нет. –

+1

Книга (а) не знает, о чем говорилось или (б) была написана до того, как эта оптимизация была включена в java, вы можете только надеяться, что ее (b) –

+0

книга была опубликована в 2012 году Apress. поэтому я думаю, что это новое. Может быть, в этот момент не будет. –

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