我正在同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[]?
你看到了调用不同重载的区别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)
您在调用中找到StringBuffer或StringBuilder刚要调用的调用String.valueOf(Object)- 然后调用toString()数组(在检查引用后不为空).数组不会toString在Java中覆盖,因此您获得的输出.