2014-05-25 4 views
4

Вывод для следующих двух кодовых блоков в Java отличается. Я пытаюсь понять, почему.Разница между новой строкой (char []) и char []. ToString

private String sortChars(String s){ 
     char[] arr = s.toCharArray(); //creating new char[] 
     Arrays.sort(arr); //sorting that array 
     return new String(arr); 
    } 

Этот символ возвращает строку с отсортированными символами, как ожидалось.

private String sortChars(String s){ 
     char[] arr = s.toCharArray(); //creating new char[] 
     Arrays.sort(arr); //sorting that array 
     return arr.toString(); 
    } 

Извините. Виноват! Использование для сравнения двух строк. Выход во вторую строку выглядит так, как это было предложено многими - [C @ 2e0ece65

Спасибо!

+0

Во втором фрагменте вы вызываете метод 'toString' в массиве, выделенном из класса Object. –

+0

Разве это не наоборот? т. е. 'new String (arr)' возвращает отсортированную строку? – user184994

+0

Вот что говорит OP: new String содержит отсортированное значение. – jordan

ответ

7

В Java toString на массиве печатается [, затем символ, представляющий тип элемента массива (в этом случае C), а затем хэш-код идентификатора. Итак, в вашем случае, вы уверены, что он возвращает исходную строку, а не что-то вроде [[email protected]?

В любом случае, вы должны использовать new String(arr). Это самый короткий, самый простой способ конвертации char[] обратно в String. Вы можете также использовать Arrays.toString(arr)

связанных с пустяков

Причина, по которой ваш метод arr.toString() возвращает что-то вроде [Cf4e6d что Object.toString возвращается

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Для char массива, getName() возвращает строку [C. Для вашей программы вы можете увидеть это с кодом:

System.out.println(arr.getClass().getName()); 

Вторая часть результата, Object.hashCode(), возвращает номер на основании адреса памяти объекта, а не содержимое массива. Это связано с тем, что по умолчанию определение «равно» для объекта является ссылочным равенством, т. Е. Два объекта одинаковы, только если они являются одним и тем же ссылочным объектом в памяти. Таким образом, вы получите различные arr.toString() значения для двух массивов на основе одной и той же строки:

String s = "fdsa"; 
char[] arr = s.toCharArray(); 
char[] arr2 = s.toCharArray(); 
System.out.println(arr.toString()); 
System.out.println(arr2.toString()); 

дает:

[[email protected] 
[[email protected] 

Обратите внимание, что это отличается для String класса, где правила равенства переопределяется, чтобы сделать его имеют значение равенства. Тем не менее, вы всегда должны использовать string1.equals(string2) для проверки равенства строк, а не ==, поскольку метод == все равно будет проверять местоположение памяти.

Смежные вопросы