Вопрос-ответ

String.equals versus == [duplicate]

String.equals versus ==

Этот код разделяет строку на токены и сохраняет их в массиве строк, а затем сравнивает переменную с первым домом ... почему это не работает?

public static void main(String...aArguments) throws IOException {

String usuario = "Jorman";
String password = "14988611";

String strDatos = "Jorman 14988611";
StringTokenizer tokens = new StringTokenizer(strDatos, " ");
int nDatos = tokens.countTokens();
String[] datos = new String[nDatos];
int i = 0;

while (tokens.hasMoreTokens()) {
String str = tokens.nextToken();
datos[i] = str;
i++;
}

//System.out.println (usuario);

if ((datos[0] == usuario)) {
System.out.println("WORKING");
}
}
Переведено автоматически
Ответ 1

Используйте string.equals(Object other) функцию для сравнения строк, а не == оператор.

Функция проверяет фактическое содержимое строки, == оператор проверяет, равны ли ссылки на объекты. Обратите внимание, что строковые константы обычно "интернированы", так что две константы с одинаковым значением действительно можно сравнить с ==, но на это лучше не полагаться.

if (usuario.equals(datos[0])) {
...
}

ПРИМЕЧАНИЕ: сравнение выполняется для 'usuario', потому что в вашем коде это гарантированно ненулевое значение, хотя вам все равно следует проверить, действительно ли у вас есть какие-то токены в datos массиве, иначе вы получите исключение, выходящее за пределы массива.

Ответ 2

Знакомьтесь, Джорман

Джорман - успешный бизнесмен, у него 2 дома.

введите описание изображения здесь

But others don't know that.

Is it the same Jorman?

When you ask neighbours from either Madison or Burke streets, this is the only thing they can say:

enter image description here

Using the residence alone, it's tough to confirm that it's the same Jorman. Since they're 2 different addresses, it's just natural to assume that those are 2 different persons.

That's how the operator == behaves. So it will say that datos[0]==usuario is false, because it only compares the addresses.

An Investigator to the Rescue

What if we sent an investigator? We know that it's the same Jorman, but we need to prove it. Our detective will look closely at all physical aspects. With thorough inquiry, the agent will be able to conclude whether it's the same person or not. Let's see it happen in Java terms.

Here's the source code of String's equals() method:

enter image description here

It compares the Strings character by character, in order to come to a conclusion that they are indeed equal.

That's how the String equals method behaves. So datos[0].equals(usuario) will return true, because it performs a logical comparison.

Ответ 3

Приятно заметить, что в некоторых случаях использование оператора "==" может привести к ожидаемому результату, потому что способ, которым java обрабатывает строки - строковые литералы интернируются (см. String.intern()) во время компиляции - поэтому, когда вы пишете, например, "hello world" в двух классах и сравниваете эти строки с помощью "==", вы можете получить результат: true, который ожидается согласно спецификации; когда вы сравниваете одинаковые строки (если они имеют одинаковое значение), когда первая является строковым литералом (т. е. Определяется через "i am string literal"), а вторая создается во время выполнения, т. е. . с ключевым словом "new", подобным new String("i am string literal"), оператор == (equality) возвращает false, потому что они оба являются разными экземплярами String класса.

Единственный правильный способ - использовать .equals() -> datos[0].equals(usuario). == говорит, только если два объекта являются одним и тем же экземпляром object (т.Е.. Имеют одинаковый адрес памяти)

Обновление: 01.04.2013 Я обновил этот пост из-за комментариев ниже, которые в некотором роде верны. Изначально я заявлял, что интернирование (String.intern) является побочным эффектом оптимизации JVM. Хотя это, безусловно, экономит ресурсы памяти (что я и имел в виду под "оптимизацией"), это в основном особенность языка

Ответ 4

equals() функция - это метод Object класса, который должен быть переопределен программистом. String класс переопределяет его, чтобы проверить, равны ли две строки, т. е. по содержанию, а не по ссылке.

== оператор проверяет, совпадают ли ссылки на оба объекта.

Рассмотрим программы

String abc = "Awesome" ;
String xyz = abc;

if(abc == xyz)
System.out.println("Refers to same string");

Здесь abc и xyz оба относятся к одному и тому же String "Awesome". Следовательно, выражение (abc == xyz) равно true.

String abc = "Hello World";
String xyz = "Hello World";

if(abc == xyz)
System.out.println("Refers to same string");
else
System.out.println("Refers to different strings");

if(abc.equals(xyz))
System.out.prinln("Contents of both strings are same");
else
System.out.prinln("Contents of strings are different");

Здесь abc и xyz две разные строки с одинаковым содержимым "Hello World". Следовательно, здесь выражение (abc == xyz) является false где как (abc.equals(xyz)) есть true.

Надеюсь, вы поняли разницу между == и <Object>.equals()

Спасибо.

2024-02-28 01:41 java string