Сравнение строк в Java - PullRequest
       52

Сравнение строк в Java

0 голосов
/ 02 декабря 2009
String string1 = "Hi there";
String string2 = "Hi";
String string3 = "Hi";

System.out.println(string1.substring(0, string2.length()) == string2); //1
System.out.println(string1.substring(0, string2.length()).equals(string2)); //2
System.out.println(string1.substring(0, string2.length()).compareTo(string2)); //3
System.out.println(string2 == string3); //4
System.out.println(string2.substring(0) == string3); //5
System.out.println(string2.substring(0) == string3.substring(0)); //6

Дает мне вывод:

false
true
0
true
true
true

Я не очень понимаю первую строку, почему она дает мне ложь?

Если я добавлю пробел в строку 2, и в этой строке я получу false, но если я не добавлю пробела, я получу true:

System.out.println(string2.substring(0, string3.length()) == string3);

Почему строка 1 должна давать мне false, а строка 6 - true, но если я добавляю пробел в string2, это false ..

Спасибо =)

Ответы [ 7 ]

14 голосов
/ 02 декабря 2009

Несколько вещей происходит там.

Когда вы объявляете две строки равными "Привет", java оптимизирует его для обращения к одному и тому же строковому объекту (поэтому ему не нужно хранить одну и ту же строку дважды).

"==" сравнивает ссылки. Когда в строке 1 вы используете подстроку, созданный строковый объект имеет другую ссылку, чем строка2.

В строке 6 я предполагаю, что substring (0) имеет оптимизацию, когда она знает, что может просто вернуть исходную строку, таким образом, эти ссылки равны.

7 голосов
/ 02 декабря 2009

Если вы хотите сравнить строки, то вам следует использовать метод String.equals() (или String.equalsIgnoreCase()). Сравнение по == говорит вам, только если две ссылки указывают на один и тот же объект. И в вашем примере это все: string2 и string3 указывают на один и тот же экземпляр строки "Hi" (почему Java должна создавать две абсолютно одинаковые строки, заданные во время компиляции)

4 голосов
/ 02 декабря 2009

Оператор == проверяет, равны ли два ОБЪЕКТА (являются ли они ссылками на один и тот же объект), не сравнивая содержащиеся в них значения.

2 голосов
/ 02 декабря 2009

Java предоставляет два основных механизма для проверка на равенство. «==» Оператор может быть использован для проверки примитива значения для равенства, а также могут быть используется для определения, если два объекта ссылки указывают на то же самое базовый объект. Для объектов Java, метод equals (Object) вернет истина, если аргумент равен объект, для которого вызывается метод, где равенство определяется семантика класса объекта.

Поскольку строки являются объектами, Метод equals (Object) вернет true если две строки имеют одинаковое содержимое, то есть одинаковые символы в одном и том же порядок. Оператор == будет только истина, если две строковые ссылки указывают на тот же базовый объект String. Отсюда две строки, представляющие тот же контент будет равен при тестировании по методу equals (Object), но будет только при равенстве при тестировании с == оператор, если они на самом деле одинаковы объект.

Цитируется по JavaTechniques: http://javatechniques.com/public/java/docs/basics/string-equality.html

1 голос
/ 02 декабря 2009

Строки 4, 5 и 6 равны true из-за следующих строк в методе substring(int, int) из java.lang.String:

return ((beginIndex == 0) && (endIndex == count)) ? this :
    new String(offset + beginIndex, endIndex - beginIndex, value);

Поскольку запрашиваемая подстрока начинается с 0 и имеет длину полной строки, вам просто возвращается ссылка на саму строку, так что a.substring(0) == a.

1 голос
/ 02 декабря 2009

Оператор == сравнивает 2 ссылки на одну и ту же строку на равенство.

Класс String имеет два метода, которые вы должны использовать для сравнения двух строк на равенство:

String1.equals(String2);

Возвращает true, если String1 и String2 идентичны (включая регистр букв).

Если вас не волнует дело, вы можете использовать:

String1.equalsIgnoreCase(String2);

Возвращает true, если String1 и String2 равны независимо от регистра (очевидно).

1 голос
/ 02 декабря 2009

== сравнить ссылку - адрес строки, а не ее значение. Для сравнения строк вы должны использовать равно. JVM будет обрабатывать новые объекты String, поэтому, если существует объект с таким же значением (строка 2 против строки 3), он может ссылаться на тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...