Как сравнивать строки в Java?

189
25 декабря 2018, 06:10

В своей программе я использовал оператор == для сравнения строк. Но я наткнулся на баг, и при замене == на equals он пропал.​​​​​​​​​​

Следует избегать оператора ==? Когда его можно использовать, а когда нет? В чём разница?

Answer 1

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

Метод equals сравнивает значения.

Следовательно, если вы хотите сравнить строки на равенство, следует использовать equals.

Однако в некоторых случаях строки гарантированно представлены одним и тем же объектом благодаря пулу строк (string interning). Эти случаи явно описаны в спецификации языка Java.

Оператор == используется для проверки, что две строки указывают на один и тот же объект.

// Эти строки имеют одно и тоже же значение
new String("test").equals("test") // --> true 
// ...но это разные объекты
new String("test") == "test" // --> false 
// ...эти строки тоже разные объекты
new String("test") == new String("test") // --> false 
// ...но эти строки указывают на один и тот же объект,
// потому что компилятор добавляет все литералы в пул.
"test" == "test" // --> true 
// Конкатенация литералов тоже происходит на стадии компиляции,
// поэтому они указывают на один объект
"test" == "te" + "st" // --> true
// но вызов substring() происходит во время выполнения,
// в результате получаются разные объекты.
"test" == "!test".substring(1) // --> false
// Строки из пула могут быть получены с помощью вызова intern().
"test" == "!test".substring(1).intern() // --> true

Надо отметить, что == заметно быстрее, чем equals (сравнение ссылки вместо вызова метода и посимвольного сравнения, если строки разной длины), поэтому, если вы работаете со строками из пула (или системного, или своего), замена equals на == может привести к заметному ускорению. Но это случается очень редко.

Остерегайтесь вызова equals на null! Оператор == прекрасно сравнивает строки, если одна или более из них равна null, но вызов метода equals на строке, равной null, приведёт к исключению.

Для сравнения строк, которые могут быть равны null, вы можете воспользоваться следующим методом:

public static boolean equals(String str1, String str2) {
    return str1 == null ? str2 == null : str1.equals(str2);
}

Он присутствует в некоторых сторонних библиотеках, например, в Apache Commons.

Если вы пользуетесь современными средами разработки, то они предупредят, если вы попытаетесь сравнить строки с помощью оператора ==. Всегда обращайте внимание на подобные предупреждения.

Answer 2

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

equals () используется в String так, он берет и сравнивает посимвольно каждый String, но это только со String, если брать остальные объекты (Вы создали объекты Яблоко и Груша), при этом в этих классах не прописан метод equals,то оно как и == сравнивает ссылки на объект, если это один и тот же объект, то тру иначе false.

В String прописан метод equals (), который сравнивает посимвольно, поэтому со String нужно юзать equals ()

READ ALSO
Объясните где ошибка!

Объясните где ошибка!

Помогите пожалуйста, вылезает ошибка:

157
Почему пишет «приложение AppName остановлено»?

Почему пишет «приложение AppName остановлено»?

Захотелось сделать приложение, которое будет в 15:45 включать звук на телефоне, а в 8:45 отключать звукЗахотелось реализовать через AsyncTask

135
Как обнулить цифры идущие после запятой?

Как обнулить цифры идущие после запятой?

Предположим у нас результатом деления оказалось число типа 2777777777

286