繁体   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