web-dev-qa-db-ja.com

JavaのtoStringメソッドが配列に対して機能しないように見えるのはなぜですか?

JavaのtoString()メソッドを使用して、文字配列を文字列オブジェクトに変換したい。以下は、私が使用したテストコードのスニペットです。

import Java.util.Arrays;
class toString{
    public static void main(String[] args){
        char[] Array = {'a', 'b', 'c', 'd', 'e', 'f'};
        System.out.println(Array.toString());
        }
}

原則としてabcdefを出力する必要がありますが、毎回[C @ 6e1408または[C @ e53108のようなものをランダムに意味不明に出力します。プログラムが実行されます。私はこれの代わりを必要としませんが、なぜこれが起こっているのか知りたいです。

33
sidharth sharma

人間が読めるtoString()を取得するには、次のように Arrays.toString() を使用する必要があります。

_System.out.println(Arrays.toString(Array));
_

Javaの配列のtoString()は_[_を出力し、その後に配列の要素のタイプを表す文字が続きます(この場合、Cchar)、次に_@_が続き、次に配列の「IDハッシュコード」(「メモリアドレス」のように考える)。

この悲しい状況は、一般的にJavaの「間違い」と見なされています。

他の「間違い」のリストは この答え を参照してください。

36
Bohemian

「原則として」それが「abcdef」を出力するべきだという考えをどこで得たのかわかりません。それはどこに文書化されていますか?

_[C@6e1408_のようなものは確かにではないランダムな意味不明なものです-これは、オブジェクトから文字列を構築する他のタイプと同じ方法ですオーバーライドtoString()は継承-型の表現(_[_は配列を示し、Ccharプリミティブ型を示します)の後にIDハッシュコードが続きますhex。詳細は Object.toString() のドキュメントを参照してください。偶然にも、配列はtoStringをオーバーライドしません。

_[a, b, c, d, e, f]_が必要な場合は、 Arrays.toString(char[]) を使用できます。 abcdefが必要な場合は、new String(char[])を使用できます。

32
Jon Skeet

次のコマンドを使用して、abcdef配列を出力します

    String a= new String(Array);

    System.out.println(a);

そこで問題が解決しました!!今なぜ他の物を印刷するのかに関して私は上記のそれらの人がそのためのいくつかの便利なリンクを置いていると思います。 Ok行かなければならない!!

2
jhkj

Char配列はプリミティブの配列であり、toString()はデフォルト(オブジェクトのハッシュ)を提供するためです。いくつかのクラスはtoString()を実装してよりクールなことを行いますが、プリミティブは実装しません。

1
Jon7

配列はtoStringをオーバーライドしません。静的メソッドがあります:Java.util.Arrays.toStringこれで問題が解決するはずです。

import Java.util.Arrays;
class toString {
    public static void main(String[] args){
        char[] Array = {'a', 'b', 'c', 'd', 'e', 'f'};
        System.out.println(Arrays.toString(Array));
    }
}
1
Brigham

Char []クラスのtoStringメソッドのデフォルト実装は、配列のベースアドレスのString表現を返します。これは、ここに出力されているものです。 char []のクラスは拡張できないため、変更することはできません。

0
Swaranga Sarma
char[] Array = { 'a', 'b', 'c', 'd', 'e', 'f' };
System.out.println(Array);

abcdefと表示されます。

0
Khanh Tran

「Array.toString()」から「Arrays.toString(Array)」へのスペルミスがあると思います。そして、name.toString()を書く代わりに、名前を引数として渡し、上記のように書き込みます。

0
Harshul