簡體   English   中英

Java:帶有字符數組的 println 給出了亂碼

[英]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) ,所以你實際上做的是追加到一個StringObject ,其調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM