==
До сих пор я использовал оператор в моей программе для сравнения всех своих строк. Тем не менее, я столкнулся с ошибкой, заменил одну из них .equals()
, и она исправила ошибку.
Это ==
плохо? Когда это должно и не должно быть использовано? Какая разница?
==
работает так же, как на объектах: stackoverflow.com/a/19966154/2284641==
будет работать некоторое время, так как у Java есть пул строк, где он пытается повторно использовать ссылки на память часто используемых строк. Но==
сравнивает, что объекты равны, а не значения ... так.equals()
что правильное использование вы хотите использовать."12"=="1"+2
ложно (вероятно)Ответы:
==
тесты на равенство ссылок (являются ли они одним и тем же объектом)..equals()
тесты на равенство значений (являются ли они логически «равными»).Objects.equals () проверяет
null
перед вызовом,.equals()
поэтому вам не нужно (доступно с JDK7, также доступно в Гуаве ).Следовательно, если вы хотите проверить, имеют ли две строки одинаковое значение, вы, вероятно, захотите использовать
Objects.equals()
.Вы почти всегда хотите использовать
Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать==
.Из JLS 3.10.5. Строковые литералы :
Подобные примеры также можно найти в JLS 3.10.5-1 .
Другие методы для рассмотрения
String.equalsIgnoreCase () значение равенства, которое игнорирует регистр.
String.contentEquals () сравнивает содержимое объекта
String
с содержимым любого объектаCharSequence
(доступно с версии Java 1.5). Избавляет вас от необходимости превращать ваш StringBuffer и т. Д. В String перед выполнением сравнения на равенство, но оставляет проверку на нуль для вас.источник
==
проверяет значение переменной. Когда у вас есть объект, переменная, которая ссылается на объект, имеет ссылку на объект в качестве значения . Таким образом, вы сравниваете ссылки при сравнении двух переменных с==
. При сравнении примитивного типа данных, такого какint
, это все тот же случай. Переменная типаint
имеет целочисленное значение. Таким образом, вы сравниваете значения двухint
с помощью==
. Еслиint
это значение переменной или магическое число не имеет значения. Кроме того: ссылка не что иное число , которое относится к памяти.==
проверяет ссылки на объекты,.equals()
проверяет строковые значения.Иногда это выглядит так, как будто
==
сравниваются значения, потому что Java делает кое-что закулисное, чтобы убедиться, что идентичные строки в действительности являются одним и тем же объектом.Например:
Но остерегайтесь нулей!
==
null
хорошо обрабатывает строки, но вызов.equals()
из пустой строки вызовет исключение:Так что, если вы знаете, что это
fooString1
может быть нулевым, скажите читателю, что написавСледующее короче, но менее очевидно, что оно проверяет на ноль:
источник
==
делать всегда сравнивают значения! (Просто определенные значения являются ссылками!)?.
. Это превратитсяnullString1?.equals(nullString2);
в совершенно нулевое утверждение. Тем не менее, это не поможет, если у вас естьvalidString?.equals(nullString);
- это все еще вызывает исключение.==
сравнивает ссылки на объекты.equals()
сравнивает строковые значенияИногда
==
дает иллюзии сравнения значений String, как в следующих случаях:Это связано с тем, что когда вы создаете какой-либо литерал String, JVM сначала ищет этот литерал в пуле String, и, если он найдет совпадение, эта же ссылка будет передана новой строке. Из-за этого мы получаем:
(a == b) ===> верно
Однако происходит
==
сбой в следующем случае:В этом случае для
new String("test")
оператора будет создана новая строка в куче, и эта ссылка будет данаb
, поэтомуb
будет дана ссылка на кучу, а не в пул строк.Теперь
a
указывает на строку в пуле строк, аb
указывает на строку в куче. Из-за этого мы получаем:если (a == b) ===> false.
Пока
.equals()
всегда сравнивает значение String, поэтому оно дает true в обоих случаях:Так что использование
.equals()
всегда лучше.источник
.equals()
Метод класса объекта сравнивает экземпляры (ссылки / адреса), где.equals()
методы класса String переопределяются для сравнения содержимого (символов)String
объекты, чтобы сохранить объем памяти,String
который известен как неизменный (я надеюсь, что я говорю это правильно здесь). Также проверьте stackoverflow.com/questions/3052442/…В
==
проверяет оператор , чтобы увидеть , если две строки в точности тот же объект..equals()
Метод будет проверить , если две строки имеют одинаковое значение.источник
Строки в Java неизменны. Это означает, что всякий раз, когда вы пытаетесь изменить / модифицировать строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это было сделано для кэширования этих экземпляров строк. Типичная программа содержит множество строковых ссылок, и кэширование этих экземпляров может уменьшить объем используемой памяти и повысить производительность программы.
При использовании оператора == для сравнения строк вы не сравниваете содержимое строки, а фактически сравниваете адрес памяти. Если они оба равны, он вернет true и false в противном случае. Принимая во внимание, что равно в строке сравнивает содержимое строки.
Таким образом, вопрос в том, все ли строки кэшированы в системе, почему
==
возвращается false, а equals возвращает true? Ну, это возможно. Если вы создаете новую строку, какString str = new String("Testing")
вы, в конечном итоге вы создаете новую строку в кеше, даже если кеш уже содержит строку с таким же содержимым. Короче"MyString" == new String("MyString")
всегда вернет false.Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кэша, поэтому
"MyString" == new String("MyString").intern()
вернет true.Примечание: оператор == намного быстрее, чем равен, просто потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.
источник
Убедитесь, что вы понимаете, почему. Это потому, что
==
сравнение сравнивает только ссылки;equals()
метод делает символ за символом сравнения содержимого.Когда вы вызываете new для
a
andb
, каждый получает новую ссылку, которая указывает на"foo"
таблицу строк. Ссылки разные, но содержание одинаковое.источник
Да, это плохо ...
==
означает, что ваши две строковые ссылки - это один и тот же объект. Возможно, вы слышали, что это так, потому что Java хранит своего рода буквальную таблицу (что она делает), но это не всегда так. Некоторые строки загружаются по-разному, создаются из других строк и т. Д., Поэтому вы никогда не должны предполагать, что две одинаковые строки хранятся в одном месте.Равный делает реальное сравнение для вас.
источник
Да,
==
это плохо для сравнения строк (любые объекты на самом деле, если вы не знаете, что они канонические).==
просто сравнивает ссылки на объекты..equals()
тесты на равенство. Для строк часто они будут одинаковыми, но, как вы обнаружили, это не гарантируется всегда.источник
У Java есть пул String, в котором Java управляет выделением памяти для объектов String. Посмотрите Струнные Бассейны на Яве
Когда вы проверяете (сравниваете) два объекта с помощью
==
оператора, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адресные ссылки, он возвращаетсяtrue
, в противном случаеfalse
. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределитьequals
метод.equals
на самом деле это метод класса Object, но он переопределяется в класс String, и дается новое определение, которое сравнивает содержимое объекта.Но учтите, что это относится к делу String. Если вы хотите сравнить без учета регистра, вы должны перейти к методу equalsIgnoreCase класса String.
Посмотрим:
источник
equalsIgnoreCase
что может быть информативным для более свежего.Я согласен с ответом от zacherates.
Но то, что вы можете сделать, это вызвать
intern()
ваши не буквальные строки.Из примера zacherates:
Если вы интернируете не буквальное равенство строк
true
:источник
==
для сравнения строк.==
сравнивает ссылки на объекты в Java , и это не исключение дляString
объектов.Для сравнения фактического содержимого объектов (в том числе
String
) необходимо использоватьequals
метод .Если сравнение двух
String
объектов с использованием==
оказываетсяtrue
, то это потому, чтоString
объекты были интернированы, и виртуальная машина Java имеет несколько ссылок указывают на один и тот же экземплярString
. Не следует ожидать, что сравнение одногоString
объекта, содержащего то же содержимое, что и другойString
объект, используется==
для оценки какtrue
.источник
.equals()
сравнивает данные в классе (при условии, что функция реализована).==
сравнивает местоположение указателя (расположение объекта в памяти).==
возвращает значение true, если оба объекта (НЕ ОБРАЩАЯСЯ О ПРИМИТИВАХ) указывают на тот же экземпляр объекта..equals()
возвращает true, если два объекта содержат одинаковые данные вequals()
сравнении==
с JavaЭто может помочь вам.
источник
==
выполняет проверку равенства ссылок, ссылаются ли 2 объекта (в данном случае строки) на один и тот же объект в памяти.equals()
Метод будет проверять ли содержимое или же состояния из 2 -х объектов являются одинаковыми.Очевидно,
==
это быстрее, но во многих случаях будет (может) давать ложные результаты, если вы просто захотите сказать, если 2String
s содержат один и тот же текст.Определенно
equals()
рекомендуется использовать метод.Не беспокойтесь о производительности. Некоторые вещи, чтобы поощрить использование
String.equals()
:String.equals()
первых проверок на равенство ссылок (с использованием==
), и если 2 строки одинаковы по ссылке, дальнейшие вычисления не выполняются!String.equals()
далее проверим длину строк. Это также быстрая операция, потому чтоString
класс хранит длину строки, не нужно подсчитывать символы или кодовые точки. Если длины различаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равны.Когда все сказано и сделано, даже если у нас есть гарантия того, что строки являются интернами, использование
equals()
метода по-прежнему не так затратно, как можно подумать, определенно рекомендуемый способ. Если вам нужна эффективная проверка ссылок, используйте перечисления, если в спецификации и реализации языка гарантируется, что одно и то же значение перечисления будет одним и тем же объектом (посредством ссылки).источник
Obviously == is faster
- на самом деле реализация.equals(String)
первых проверок==
прежде всего, поэтому я бы сказал, что скорость примерно одинакова.public boolean equals(Object anObject) { if (this == anObject) { return true; } ...
Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор "==", чтобы проверить, равны ли два экземпляра String, но, что бы там ни было, это неправильный способ сделать это в Java.
В этом уроке я продемонстрирую несколько разных способов правильного сравнения строк Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сравнению строк Java я также расскажу, почему оператор "==" не работает при сравнении строк Java.
Вариант 1. Сравнение строк Java с методом equals В большинстве случаев (возможно, в 95% случаев) я сравниваю строки с методом equals класса Java String, например:
Этот метод String equals просматривает две строки Java, и если они содержат одинаковую строку символов, они считаются равными.
Взглянув на пример быстрого сравнения строк с помощью метода equals, если бы был выполнен следующий тест, две строки не были бы признаны равными, поскольку символы не совпадают (случай символов отличается):
Но когда две строки содержат одинаковую строку символов, метод equals вернет true, как в этом примере:
Вариант 2. Сравнение строк с помощью метода equalsIgnoreCase
В некоторых тестах сравнения строк вы захотите игнорировать, являются ли строки прописными или строчными. Если вы хотите проверить строки на равенство в этом случае без учета регистра, используйте метод equalsIgnoreCase класса String, например:
Вариант 3: сравнение строк Java с помощью метода CompareTo
Существует также третий, менее распространенный способ сравнения строк Java, это метод класса String CompareTo. Если две строки абсолютно одинаковы, метод compareTo вернет значение 0 (ноль). Вот быстрый пример того, как выглядит этот подход сравнения строк:
Хотя я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты и хотите предоставить средство, чтобы увидеть, равны ли два экземпляра вашего объекта, вы должны переопределить (и реализовать) этот метод equals в вашем классе (так же, как язык Java обеспечивает это равенство / поведение сравнения в методе String equals).
Возможно, вы захотите взглянуть на это ==, .equals (), compareTo () и сравнить ()
источник
Функция:
Тестовое задание:
источник
==
иequals
уже отвечали другие решения, я просто предложил другой способ свободного сравнения строк==
Проверка оператора , если две ссылки указывают на один и тот же объект или нет..equals()
проверить фактическое содержимое строки (значение).Обратите внимание, что
.equals()
метод принадлежит классуObject
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с требованиями вашего класса, но для String оно уже реализовано и проверяет, имеют ли две строки одинаковое значение или нет.Дело 1
Причина: строковые литералы, созданные без нуля, хранятся в пуле строк в области permgen кучи. Таким образом, s1 и s2 указывают на один и тот же объект в пуле.
Дело 2
Причина: если вы создаете объект String с использованием
new
ключевого слова, ему выделяется отдельное пространство в куче.источник
==
сравнивает эталонное значение объектов, тогда какequals()
метод, присутствующий вjava.lang.String
классе, сравнивает содержимоеString
объекта (с другим объектом).источник
equals()
метод наString
самом деле вString
классе, а не вObject
. Значение по умолчанию дляequals()
inObject
не будет сравнивать, что содержимое одинаково, и на самом деле просто возвращает true, когда ссылка одинакова.Я думаю, что когда вы определяете,
String
вы определяете объект. Так что вам нужно использовать.equals()
. Когда вы используете примитивные типы данных, которые вы используете,==
но сString
(и любым объектом) вы должны использовать.equals()
.источник
Если
equals()
метод присутствует вjava.lang.Object
классе, и ожидается, что он проверит эквивалентность состояния объектов! Это означает, что содержимое объектов. Принимая во внимание, что==
оператор, как ожидают, проверит, фактические экземпляры объекта одинаковы или нет.пример
Рассмотрим две разные ссылочные переменные
str1
иstr2
:Если вы используете
equals()
Вы получите вывод, как
TRUE
будто вы используете==
.Теперь вы получите
FALSE
выходные данные, потому что обаstr1
иstr2
указывают на два разных объекта, даже если оба они имеют одинаковое строковое содержимое. Именно из-заnew String()
нового объекта создается каждый раз.источник
Оператор == всегда предназначен для сравнения ссылок на объекты , тогда как метод класса String .equals () переопределяется для сравнения содержимого :
источник
Все объекты гарантированно имеют
.equals()
метод, поскольку Object содержит метод.equals()
, который возвращает логическое значение. Задача подкласса - переопределить этот метод, если требуется дополнительное определение. Без этого (т.е. с использованием==
) только адреса памяти проверяются между двумя объектами на равенство. Строка переопределяет этот.equals()
метод и вместо использования адреса памяти возвращает сравнение строк на уровне символов для равенства.Ключевым моментом является то, что строки хранятся в одном единственном пуле, поэтому после создания строки она всегда сохраняется в программе по одному и тому же адресу. Строки не меняются, они неизменны. Вот почему плохая идея использовать обычную конкатенацию строк, если у вас есть серьезный объем обработки строки. Вместо этого вы бы использовали
StringBuilder
предоставленные классы. Помните, что указатели на эту строку могут меняться, и если вам интересно узнать, совпадают ли два указателя, это==
будет хорошим способом. Сами струны нет.источник
final String
переменные) и строки, которые ваша программа явно интернирует, хранятся в том, что вы называете «объединенным пулом». Все другиеString
объекты подлежат сборке мусора, если на них больше нет живых ссылок, как и любой другой тип объекта. Кроме того, хотя для работы всего интернирующего механизма требуется неизменность, в остальном это не имеет значения.Вы также можете использовать
compareTo()
метод для сравнения двух строк. Если результат CompareTo равен 0, тогда две строки равны, иначе сравниваемые строки не равны.==
Сравнивает ссылки и не сравнить фактические строки. Если вы создали каждую строку, используя,new String(somestring).intern()
то вы можете использовать==
оператор для сравнения двух строк, в противном случае можно использовать только методы equals () или compareTo.источник
В Java, когда оператор «==» используется для сравнения 2 объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли два имени объекта в основном ссылками на одну и ту же ячейку памяти.
Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object - и он переопределяет метод так, что он проверяет только значения строк, а не их расположение в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух строковых объектов, то при условии, что фактическая последовательность символов равна, оба объекта считаются равными.
источник