web-dev-qa-db-ja.com

Java:char配列を含むprintlnは意味不明です

ここに問題があります。このコード:

String a = "0000";
 System.out.println(a);
char[] b = a.toCharArray();
 System.out.println(b);

戻り値

 0000 
 0000 


しかし、このコード:

String a = "0000";
 System.out.println("String a: " + a);
char[] b = a.toCharArray();
 System.out.println("char[] b: " + b);

戻り値

文字列a:0000 
 char [] b:[C @ 56e5b723 


世界で何が起こっているのですか?十分に簡単な解決策があるはずですが、私はそれを理解できないようです。

25
stephenwade

あなたが言う時

_System.out.println(b);
_

print(char[] s)を呼び出し、次にprintln()を呼び出します。

print(char[] s)のJavaDocは次のように言います:

文字の配列を出力します。文字はプラットフォームのデフォルトの文字エンコーディングに従ってバイトに変換され、これらのバイトはwrite(int)メソッドとまったく同じ方法で書き込まれます。

そのため、バイト単位の印刷を実行します。

あなたが言う時

_System.out.println("char[] b: " + b);
_

print(String)の呼び出しになります。したがって、実際に実行しているのは、toString()を呼び出すStringObjectObject-これは、デフォルトですべてのObjectと同様に、Arrayの場合、参照の値(メモリアドレス)を出力します。

できること:

_System.out.println("char[] b: " + new String(b));
_

これは「間違っている」ことに注意してください。これは、エンコードを気にせず、システムのデフォルトを使用しているという意味です。エンコードについては、後ほどではなく早く学びましょう。

28
Doug Moscrop
System.out.println("char[] b: " + b);

これは

System.out.println(("char[] b: " + b.toString());

「Object.toString()」を検索できます

5
chenyun

使用する

System.out.println("char[] b: " + Arrays.toString(b));

あなたが得る飾りは、オブジェクトのメモリアドレスが続くクラス名です。 bを文字列char[] b:で追加しようとすると問題が発生します。この場合、char配列b.toString()メソッドが呼び出されるため、[C @ 56e5b723が出力されます。

[配列であることを示しますCこのクラスの場合、char @ 56e5b723はメモリの場所を示します

4
shazin

配列のtoString()メソッド(_"..." + b_を実行するときに呼び出されるメソッド)は、デバッグ出力を提供することのみを目的としています。 _char[]_のtoString()が元の文字列を与える特別なケースはありません-すべての型の配列は同じtoString()実装を持ちます。

Char配列から元の文字列を取得する場合は、次を使用します。

_String a2 = new String(b);
_
4
millimoose

3:e行を使用してください!

Scanner input = new Scanner(System.in);
char[] txt = input.next().toCharArray();
System.out.println((char[])txt);
1
user1991275