簡體   English   中英

List.valueOf()在List中使用char []的行為<char[]>

[英]String.valueOf() behavior with char[] in List<char[]>

我正在使用char[]Collection使用以下代碼: -

    char[] ch = { 'a', 'b', 'c' };
    List<char[]> chList = new ArrayList<char[]>();
    chList.add(new char[]{'d','e','f'});
    chList.add(new char[]{'g','h','i'});
    String chSt = String.valueOf(ch);
    String chListSt = chList.toString(); 
    System.out.println(chSt);  // outputs  abc
    System.out.println(chListSt); // outputs [[C@8288f50b, [C@b6d2b94b] instead [def, ghi]

現在我在上面觀察到的是: -

    String chSt = String.valueOf(ch);

我知道上面的代碼行為對於String.valueOf() char[]是正確的,所以對於上面的代碼,打印出abc 現在考慮下一行。

    String chListSt = chList.toString(); 

同樣對於上面的代碼,我知道ListtoString()是在AbstractList中定義的,在這個overriden toString()的代碼中我找到了buffer.append(next); 它調用char[]上的String.valueOf()方法,該方法對應於next

因此它也應該像[def, ghi]一樣打印,就像在String chSt = (String.valueOf(ch));使用char[]的直接情況一樣String chSt = (String.valueOf(ch));

為什么這兩種情況都會出現這種變化,而在char[]上調用相同的方法String.valueOf()

你看到調用String.valueOf不同重載的區別。 這是一個更簡單的例子:

public class Test {
    public static void main(String[] args) {
        char[] chars = { 'a', 'b', 'c' };
        System.out.println(String.valueOf(chars));  // abc
        Object object = chars;
        System.out.println(String.valueOf(object));  // [C@...
    }
}

您在StringBufferStringBuilder找到的調用只是調用String.valueOf(Object) - 然后在數組上調用toString() (在檢查引用后不為null)。 數組不會覆蓋Java中的toString ,因此您獲得的輸出。

代碼String chListSt = chList.toString(); 簡單地調用List的toString()實現。 List實現調用元素上的toString()實現。

您當前的列表將列表中的數組對象作為元素,因此您將在控制台上獲得一個array.toString()表示,從而生成為char []打印的十六進制代碼。

而不是char []嘗試在數組中保存字符串。 它將具有相同的性能,結果將是可讀的。

char[] ch = { 'a', 'b', 'c' };

上面的一個是文字,因此valueof()方法賦予它值。

chList.add(new char[]{'d','e','f'});
chList.add(new char[]{'g','h','i'});

這些列表中存儲了對象,因此您獲得了他們的哈希碼...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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