Демонстрация сравнения строк с Java - PullRequest
7 голосов
/ 31 августа 2010

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

Здесьэто то, что я попробовал:

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 я фактически сравниваю две ссылки (то есть адреса) вместо содержимого объекта.

Но на самом деле я получил такой вывод: same strings!

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

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

Ответы [ 3 ]

17 голосов
/ 31 августа 2010

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

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

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

2 голосов
/ 01 сентября 2010

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

Вот способ:

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

Также будьте осторожны при сравнении примитивных оболочек и использовании автобокса: Integer (и Long), например, кеширует (и повторно использует!) Значения -128..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 голосов
/ 10 августа 2015

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

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

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

это дало бы вам вывод: "разные строки". Ключевое слово "new" создает ссылку на новый объект, в то время как отсутствие нового сначала проверяет пул строк на наличие.

...