2009-06-14 1 views
32

От Sun Java Tutorial, я бы подумал, что этот код преобразует набор в массив.Java: Преобразование набора в массив для представления строк

import java.util.*; 

public class Blagh { 
    public static void main(String[] args) { 
     Set<String> set = new HashSet<String>(); 
     set.add("a"); 
     set.add("b"); 
     set.add("c"); 
     String[] array = set.toArray(new String[0]); 
     System.out.println(set); 
     System.out.println(array); 
    } 
} 

Однако это дает

[a, c, b] 
[Ljava.lang.String;@9b49e6 

Что я неправильно понял?

+2

"[Ljava.lang.String; @ 9b49e6" Является массивом строк. – Fredrik

+0

Был ли порядок элементов точным в этом? У меня такая же ситуация, когда порядок, похоже, имеет собственный разум, а не порядок в том, что элементы были добавлены. – electrichead

+0

Установки вообще не имеют определенного порядка, поэтому вы не можете полагаться на то, что вы поместите элементы в набор, такие же, как и порядок, который вы получаете. Попробуйте реализацию LinkedHashSet интерфейса Set, если это то, что вы хотите; он добавляет эту гарантию. – Frans

ответ

32

Код работает нормально.

Заменить:

System.out.println(array); 

С:

System.out.println(Arrays.toString(array)); 

Выход:

 
[b, c, a] 
[b, c, a] 

String представление массива отображает в "текстовое представление" массива, полученного Object.toString - который является именем класса и хэш-кодом массива как hexidecimal string.

+0

Некоторые части Java могут быть немного недружелюбными. – coobird

+1

Это не адрес, но Object.hashCode() ... – Joey

+0

Хороший звонок, я исправлю это, спасибо! – coobird

1

Я не думаю, что вы что-то поняли; код должен работать. Массив, однако, не достаточно умен, чтобы распечатать его содержимое в методе ToString, поэтому вам придется распечатать содержимое с

for(String s : array) println(s); 

или что-то в этом роде.

5

Все нормально.

Вы не видите содержимое массива с помощью System.out.println (array), потому что println вызывает object.toString(), чтобы получить байты из объекта для вывода.

Поскольку HashSet переопределяет реализацию по умолчанию toString(), вы можете увидеть содержимое набора с помощью System.out.println (set);

В массивах не перекрывающих ToString() по умолчанию (что дает название класса и своего рода идентичности хэш-код), вы получаете нечеткий [Ljava.lang.String; @ 9b49e6

Надежда, которая помогает

9

для проверки полноты также java.util.Arrays.toString и java.util.Arrays.deepToString.

Последнее особенно полезно при работе с вложенными массивами (например, Object [] []).

+0

Я согласен, хорошо, что эти методы могут быть более эффективными, чем создание промежуточного списка через asList(), особенно для больших массивов. Обратите внимание, что функция deepToString() наиболее полезна для многомерных массивов и сложной вложенности. –

2

Как уже упоминалось DFA, вы можете просто заменить:

System.out.println(array); 

с ...

System.out.println(Arrays.toString(array)); 
0

У вас есть правильный результат. К сожалению, метод toString() в массиве по-прежнему является исходным Object.toString(), поэтому выход по умолчанию не используется, но для всех массивов.

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