2010-08-31 4 views
7

Я хочу продемонстрировать с помощью нескольких строк кода, что в Java, чтобы сравнить две строки (String), вы должны использовать equals() вместо оператора ==.Демонстрируя сравнение строк с Java

Вот то, что я пробовал:

public static void main(String Args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 

    if (s1 == s2) 
     System.out.println("same strings"); 
    else 
     System.out.println("different strings"); 
} 

Я ожидал, что этот вывод: different strings, потому что с помощью теста s1 == s2 я фактически сравнивая две ссылки (то есть адреса) вместо содержания Objet в.

Но я действительно получил этот выход: same strings!

Сидя в Интернете, я обнаружил, что некоторые реализации Java позволит оптимизировать код выше, так что s1 и s2будет ссылающийся ту же строку.

Ну, как я могу продемонстрировать проблему с помощью оператора == при сравнении строк (или объектов) в Java?

+1

Собственно, для JLS все компиляторы Java должны выполнять эту оптимизацию. – Darron

ответ

17

Компилятор делает некоторые оптимизации в вашем случае, так что s1 и s2 действительно являются одним и тем же объектом. Вы можете обойти это, используя

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

Тогда у вас есть два разных объекта с одним и тем же текстовым контентом.

+0

спасибо! Я не знал, что использование 'new' или нет, когда instanciating String создаст что-то другое! –

2

Хорошо, как я могу продемонстрировать проблему, используя оператор == при сравнении строк (или объектов) в Java?

Вот способ:

String s = "ab"; 
String t = new String("ab"); 
System.out.println(s == t); // false 

быть также осторожным при сравнении примитивных оберток и с помощью авто-бокс: Integer (и Long), например кэшей (! И повторно использует) значения -128. 0,127. Итак:

Integer s = -128; 
Integer t = -128; 
System.out.println(s == t); 

напечатает true, в то время как:

Integer s = -129; 
Integer t = -129; 
System.out.println(s == t); 

гравюр false!

+0

Спасибо. Я не знал о кешировании значений -128..127. Я не уверен, что понял, почему Java это делает, но это хорошо знать! –

+0

@ Jérôme, это сделано потому, что разработчики думали (думают), что эти значения использовались так часто, что было полезно * не * создавать новые экземпляры этих значений каждый раз. И поскольку они неизменяемы, это не может повредить * повторное использование * этих экземпляров. –

+1

Его отличный пример мухи. – Vivart

0

JAVA поддерживает пул строк в кучном пространстве, где он пытается иметь несколько ссылок для тех же значений, если это возможно.

Если бы Вы написали:

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

это дало бы вам результат:. «Разные строки» «новый» ключевое слово создает новый эталонный объект не давая новый будет первым проверить строку бассейн для своего существования ,

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