JAVA的数组类和String类转换问题
问题来源
Java小白,在学习java的过程中遇到了一个关于数组类转换为string类输出的问题。
java源码为:
public static String generateTheString3(int n) {
char[] ret=new char[n];
int i=n;
if(n%2==0){
i=n-1;
ret[n-1]='b';
}
for(int j=0;j<i;j++){
ret[j]='a';
}
return ret.toString();//输出[C@2f92e0f4
}
代码中首先声明一个char型数组并往里面添加字母,最后想通过.toString()方法把数组转化为字符串输出,但是通过结果可以发现输出的值并不在预期内,这里就出现连个问题:
1、为何会产生这个输出?
2、这输出的是一个什么玩意?
问题探究
在多方探究下,结合API源码,得出了比较有说服力的说法,主要分为几点:
1、Java中的所有类,探究到底均继承自Object类,toString()方法的最初版本也是在Object类中实现的;
2、在Object类中的toString()方法输出的为[类型@哈希值](这解决了第二个问题)。API源码如下:
3、所有没有重写toString()方法的类,在运用toString()方法时输出的结果可从上图类比。很显然,Array类的中并没有重写toString()方法(这解决了第一个问题)。
解决方法
了解完问题的原因,当然是找到解决方法,下面提供三种解决方法:
1、重写toString(),简单粗暴,但是比较麻烦。。这里不具体实现了。
2、新声明一个String对象,在声明时转换:
public static String generateTheString2(int n) {
char[] ret=new char[n];
int i=n;
if(n%2==0){
i=n-1;
ret[n-1]='b';
}
for(int j=0;j<i;j++){
ret[j]='a';
}
String string=new String(ret);
return string;//输出aaaaaaa
}
3、通过String类中的valueOf()静态方法完成转换:
public static String generateTheString1(int n) {
char[] ret=new char[n];
int i=n;
if(n%2==0){
i=n-1;
ret[n-1]='b';
}
for(int j=0;j<i;j++){
ret[j]='a';
}
return String.valueOf(ret);//输出aaaaaaa
}
另外插入一个小技巧,是在这次找问题原因时的一个小收获:
valueOf()方法虽然也是通过toString()方法实现的,但是toString()方法在使用时需要保证数组不为null,不然会抛出错位,而valueOf()方法解决了这一问题。
到此,结束。