web-dev-qa-db-ja.com

Java:文字列表現のためにセットを配列に変換する

Sunの Java Tutorial から、このコードがセットを配列に変換すると思っていたでしょう。

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

私は何を誤解しましたか?

32
inglesp

コードは正常に動作します。

交換:

System.out.println(array);

と:

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

出力:

 [b、c、a] 
 [b、c、a] 

配列のString表現は、 Object.toString -によって取得された配列の「テキスト表現」を表示します。これは、クラス名と配列のハッシュコードです16進文字列として。

32
coobird

完全性チェックのために、- Java.util.Arrays.toString および Java.util.Arrays.deepToString もチェックします。

後者は、ネストされた配列(Object [] []など)を扱うときに特に役立ちます。

9
dfa

大丈夫です。

Printlnはobject.toString()を呼び出して出力用のオブジェクトからバイトを取得するため、System.out.println(array)で配列の内容は表示されません。

HashSetはデフォルトのtoString()実装をオーバーライドするため、System.out.println(set);でセットの内容を確認できます。

配列はデフォルトのtoString()(クラス名と何らかのIDハッシュコードを与える)をオーバーライドしないため、ファジー[Ljava.lang.String; @ 9b49e6

役立つことを願っています

5
Reginaldo

Dfaが述べたように、単に置き換えることができます:

System.out.println(array);

と...

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

あなたは何かを誤解しているとは思わない。コードは動作するはずです。ただし、配列はtoStringメソッドでコンテンツを印刷するほどスマートではないため、次のようにコンテンツを印刷する必要があります。

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

またはそのようなもの。

1
jpalecek

正しい結果が得られました。残念ながら、配列のtoString()メソッドは元のObject.toString()のままなので、出力はデフォルトでは多少使用できませんが、すべての配列に適用されます。