Нет никаких указаний на bar () и baz () - единственное, что Стандарт говорит, что они оба будут оценены до вызова foo (). Из стандарта C ++, раздел 5.2.2 / 8:
Порядок оценки аргументов неуточнен.
blockquote>
Используйте функцию string.equals (Object other)
для сравнения строк, а не ==
оператор.
Функция проверяет фактическое содержимое строки, оператор ==
проверяет, равны ли ссылки на объекты. Обратите внимание, что строковые константы обычно «интернированы» таким образом, что две константы с одинаковым значением могут фактически сравниваться с ==
, но на это лучше не полагаться.
if (usuario.equals(datos[0])) {
...
}
NB: сравнение выполняется на 'usuario', потому что это гарантированно ненулевое значение в вашем коде, хотя вы все равно должны проверить, что у вас действительно есть несколько токенов в массиве datos
, в противном случае вы получите исключение массива вне границ .
Вы должны использовать строку, равную , чтобы сравнить две строки на равенство, а не оператор ==, который просто сравнивает ссылки.
Вместо
datos[0] == usuario
используйте
datos[0].equals(usuario)
==
сравнивает ссылку на переменную, где .equals ()
сравнивает значения, которые вы хотите.
Приятно отметить, что в некоторых случаях использование оператора "==" может привести к ожидаемому результату потому что способ, которым 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. Хотя это, безусловно, экономит ресурсы памяти (что я имел в виду под «оптимизацией»), в основном это особенность языка
Это также будет работать, если вы вызовете 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");
}