Создание строк из байтов / целых в Java - PullRequest
2 голосов
/ 27 августа 2009

Мне интересно, почему следующий код не работает:

String test = new String(new byte[] {92, 92, 92, 92, 92});
System.out.println(test);
String compare = "\\\\\\\\\\";
System.out.println(compare);
if (test == compare) {
System.out.println("Yes!");
}

Вывод:

\\\\\
\\\\\

Где происходит преобразование типов данных, которое я не понимаю?

Редактировать: / ошибка: (

Ответы [ 4 ]

9 голосов
/ 27 августа 2009

Строки сравниваются с .equals (), а не с ==

Причина в том, что со ссылками (как строковые переменные) == просто проверяет равенство в ячейке памяти, а не в содержимом.

Буква \\\ существовала в одном месте в памяти. другой создается где-то еще, где вы строите строку. Они не находятся в одном и том же месте, поэтому они не возвращают true, когда вы это делаете ==

Вы должны сделать

if(test.equals(compare))
5 голосов
/ 27 августа 2009

Строки в Java являются ссылочными типами, и == проверяет, являются ли они одинаковой строкой, а не равной строкой Запутанно я знаю. Короче говоря, вам нужно сделать это:

if( test.equals( compare ) ) {

Подробнее вы можете посмотреть здесь: http://leepoint.net/notes-java/data/strings/12stringcomparison.html

3 голосов
/ 27 августа 2009

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

Однако следующий тест будет верным:

test.intern() == compare.intern()
2 голосов
/ 27 августа 2009

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

Попробуйте test.equals(compare). Тогда попробуйте test.intern() == compare. Оба должны работать. Метод intern - единственный надежный способ сравнения идентификаторов объектов на String объектах.

...