String.equals против == [дубликата]

Нет никаких указаний на bar () и baz () - единственное, что Стандарт говорит, что они оба будут оценены до вызова foo (). Из стандарта C ++, раздел 5.2.2 / 8:

Порядок оценки аргументов неуточнен.

509
задан codeforester 3 September 2018 в 20:44
поделиться

5 ответов

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

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

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

NB: сравнение выполняется на 'usuario', потому что это гарантированно ненулевое значение в вашем коде, хотя вы все равно должны проверить, что у вас действительно есть несколько токенов в массиве datos , в противном случае вы получите исключение массива вне границ .

553
ответ дан 22 November 2019 в 22:31
поделиться

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

9
ответ дан 22 November 2019 в 22:31
поделиться

Вместо

datos[0] == usuario

используйте

datos[0].equals(usuario)

== сравнивает ссылку на переменную, где .equals () сравнивает значения, которые вы хотите.

26
ответ дан 22 November 2019 в 22:31
поделиться

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

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

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

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

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

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

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

93
ответ дан 22 November 2019 в 22:31
поделиться

Это также будет работать, если вы вызовете intern () в строке перед ее вставкой в ​​массив. Интернированные строки равны по ссылкам ( == ) если и только если они равны по значению ( equals () .)

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.intern();            
    i++;
}

//System.out.println (usuario);

if(datos[0]==usuario) {  
     System.out.println ("WORKING");    
}
12
ответ дан 22 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: