[英]Java: println with char array gives gibberish
這就是問題所在。 這段代碼:
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);
返回
String a: 0000 char[] b: [C@56e5b723
世界上到底發生了什么? 似乎應該有一個足夠簡單的解決方案,但我似乎無法弄清楚。
當你說
System.out.println(b);
它導致調用print(char[] s)
然后println()
用於print(char[] s)
的JavaDoc print(char[] s)
說:
打印一個字符數組。 根據平台的默認字符編碼將字符轉換為字節,這些字節的寫入方式與write(int)方法完全相同。
因此它執行逐字節打印輸出。
當你說
System.out.println("char[] b: " + b);
這導致調用print(String)
,所以你實際上做的是追加到一個String
的Object
,其調用toString()
的Object
-這一點,因為所有的Object
默認情況下,在的情況下,一個Array
,打印引用的值(內存地址)。
你可以這樣做:
System.out.println("char[] b: " + new String(b));
請注意,這是“錯誤的”,因為您沒有考慮編碼並使用系統默認值。 盡快了解編碼。
System.out.println("char[] b: " + b);
這就像
System.out.println(("char[] b: " + b.toString());
你可以查找“Object.toString()”
使用
System.out.println("char[] b: " + Arrays.toString(b));
你得到的gibrish是Class名稱,后跟對象的內存地址。 當您嘗試使用字符串char[] b:
追加b時會出現問題char[] b:
在這種情況下,將調用char數組b.toString()方法[C @ 56e5b723。
[表示它是一個數組C表示在這種情況下的類char @ 56e5b723表示內存位置
數組的toString()
方法(當你執行"..." + b
時調用的方法)僅用於提供調試輸出。 沒有特殊情況, char[]
的toString()
將為您提供原始字符串 - 所有類型的數組都具有相同的toString()
實現。
如果要從char數組中獲取原始字符串,請使用:
String a2 = new String(b);
使用3:e行!
Scanner input = new Scanner(System.in);
char[] txt = input.next().toCharArray();
System.out.println((char[])txt);
private void print(char[] arr) {
try {
PrintStream stream
= new PrintStream(System.out);
stream.println(arr);
stream.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.