关于字符数组cs.toString和new String(cs)的问题

总结写在前面:

     int[] a={0, 1, 1, 2, 8, 4, 9};
System.out.println(String.valueOf(a));-----类型+句柄 System.out.println(a.toString());----------类型+句柄 System.out.println(Arrays.toString(a));----[0, 1, 1, 2, 8, 4, 9] System.out.println(
new String(a));------参数错误 char[] ss={'1','2','3','4','5'}; System.out.println(String.valueOf(ss));---12345的字符串 System.out.println(new String(ss));-------12345的字符串 System.out.println(ss.toString());--------类型+句柄 System.out.println(Arrays.toString(ss));---[1, 2, 3, 4, 5]
综上,
对于char[]和int[]想要获得[ , , ]形式,使用Arrays.toString()即可
想要获得字符串类型,char[]可选择 new String( ),或者String.valueOf()
int[] 只能使用for循环了。

String.valueOf()本质也是toString,只不过可接受Null,参数有各种基本类型及 char数组,返回字符串的表现形式

 

做Leetcode,345. Reverse Vowels of a String

思路完全正确,结果却一直不对

System.out.print(cs.toString);

还是奇奇怪怪的结果

像:[C@15db9742或者[C@15db9742等等

改成 System.out.print(new String(cs));就对了

 

首先:明确toString()是Object类的方法,所以所有类创建的时候都有这个方法并能够调用

同时:java输出用的函数print();是不接受对象直接输出的,只接受字符串或者数字之类的输出。

当System.out.print(XXXX); 当XXXX不是字符串或者数字的时候,此时可以编译成功,

但是运行时因为不满足条件,就会去调用这个对象类里面的toString 方法,输出结果为[类型@哈希值]

所以,不管有没有XXX.toString(),何况还特意toString()了

看一下Object里面toString()源码

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

正如前面出现的问题,由于数组类中没有对此方法重写(override),仅仅是重载(overload)为类的静态方法(参见java.util.Arrays)。

所以,数组直接使用toString()的结果也是[类型@哈希值]。

****最终****

三种方式数组转化字符串

char[] cs={'a','b','c','d'};
Array.toString(cs);-------这种是[a,b,d,d]这种格式的

String.valueOf(cs);
String str=new String(cs);-----最最最正常的啦
---------这种就是很正常的 abcd 的了

 4/10补充:

[a,b,d,d]这种格式可以直接打印下面的
   List<Integer> ret = new ArrayList<Integer>();
Array.toString(cs);
 如果是数字数组的话,,还是乖乖的循环吧

 

posted @ 2017-04-07 13:11  Nicolellu  阅读(1387)  评论(0编辑  收藏  举报