List <char []>中char []的String.valueOf()行为

Ank*_*gam 3 java collections

我正在同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]
Run Code Online (Sandbox Code Playgroud)

现在我在上面观察到的是: -

    String chSt = String.valueOf(ch);
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码的行为是正确的char[]String.valueOf(),所以上面的代码abc被打印出来.现在考虑下一行.

    String chListSt = chList.toString(); 
Run Code Online (Sandbox Code Playgroud)

同样对于上面的代码我知道toString()for List是在AbstractList这个overriden的代码中定义的,toString()我发现buffer.append(next);哪个调用String.valueOf()方法char[]对应于next这里.

因此,它也应该打印像[def, ghi],如直接用的情况下char[]在线路String chSt = (String.valueOf(ch));

为什么这两种情况都会出现这种变化,同时String.valueOf()调用相同的方法char[]

Jon*_*eet 7

你看到了调用不同重载的区别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@...
    }
}
Run Code Online (Sandbox Code Playgroud)

您在调用中找到StringBufferStringBuilder刚要调用的调用String.valueOf(Object)- 然后调用toString()数组(在检查引用后不为空).数组不会toString在Java中覆盖,因此您获得的输出.

  • @AnkitNigam:因为调用`String.valueOf`的代码不知道参数是`char []`.不要忘记在编译时确定重载决策. (2认同)