2013-11-14 4 views
0

Я занимался практикой в ​​области компьютерных наук и пробовал этот вопрос.String boolean confusion

String sam = "scary"; 
String ben = new String("scary"); 
String wil = "scary"; 
out.print(sam == ben); 
out.print(" " + (sam == wil)); 

Из моих знаний я думал распечатки бы неверно ложные, потому что от того, что я знаю, строки можно сравнить только с .equals(). Но я ошибся. В нем говорится, что ответ был ложным. Может кто-нибудь объяснить, почему?

+1

На каком языке это? – Neal

+0

Я использую Java – user2990622

+0

Так что добавьте тег [java] на свой вопрос в следующий раз @ user2990622 – Neal

ответ

4

Вы можете сравнить строки с ==. Тем не менее, это сравнивает строку с ссылками, а не с последовательностями символов.

Если две последовательности символов различны, == всегда будет оценивать значение false. Если они одинаковы, == может вернуть true или может возвращать false; это зависит от того, как появились два строковых объекта.

Причина sam и wil относятся к одному объекту прописано в JLS §3.10.5 String Literals:

Строковые литералы - или, в более общем случае, строки, которые являются значения констант (§15.28) - являются «интернированы» чтобы обмениваться уникальными экземплярами, используя метод String.intern.

См. Пример 3.10.5-1 в JLS для подробной иллюстрации этого поведения.

0

Когда вы создаете строки без нового слова, jre ищет в пуле строк, которые вы создали ранее, для String, имеющего один и тот же контент, если он находит его, тогда нет необходимости создавать новую строку в памяти и просто возвращает новую строку к той, которую вы создали ранее. С другой стороны, используя новое ключевое слово, вы вынуждаете создать новый объект.