黑马程序员技术交流社区
标题:
打印字符数组的问题
[打印本页]
作者:
刘云龙
时间:
2013-3-4 23:30
标题:
打印字符数组的问题
class Question
{
public static void main(String[] args)
{
char[] arr = {'a','b','c','d','e'};
System.out.println(arr);//打印abcde
int [] arr1 = {1,2,3,4,5};
System.out.println(arr1);//打印[I@5e55ab
}
}
复制代码
结果是
abcde
[I@5e55ab
为什么字符数组不是打印的数组的地址?
作者:
lzw123451
时间:
2013-3-5 00:31
本帖最后由 李志卫 于 2013-3-5 02:23 编辑
特别优待
看下面代码,你会发现char[]数组并没有重写toString方法
class Test14
{
public static void main(String[] args)
{
String s = "abc";
byte[] b = s.getBytes();
System.out.println(b.toString());
System.out.println(new String(b));
char[] arr = {'a','b','c','d','e'};
System.out.println(arr);
System.out.println(arr.toString()); // 结果是 [C@1fc4bec
int [] arr1 = {1,2,3,4,5};
System.out.println(arr1.toString());
}
}
复制代码
作者:
amen0205
时间:
2013-3-5 02:01
本帖最后由 门文通 于 2013-3-5 02:37 编辑
输出语句会调用toString方法。Object类中的toString方法返回值为 getClass().getName() + '@' + Integer.toHexString(hashCode())
而字符数组中的 toString方法被复写了,返回的为String对象。所以可以abcde。
这是错的
作者:
李辉
时间:
2013-3-5 02:02
我猜想是因为字符数组的定义里面override了toString方法,而整数数组没有override。我试图从api文档里找出答案,可是那里面好像没有。
作者:
amen0205
时间:
2013-3-5 02:36
刚才我说的不对 误人子弟了 我又查了下
API在print方法中有这样的说明
print
public void print(char[] s)
打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
参数:
s - 要打印的字符数组
抛出:
NullPointerException - 如果 s 为 null
这才是为什么会打印abcde的原因
作者:
移动小坦克
时间:
2013-3-5 02:38
通过百度搜到:
看完这两个例子你就会明白了
例1
public class LastLaugh{
public static void main(String[] args){
System.out.print("H"+"a");
System.out.print('H'+'a');
}
}
运行结果是Ha169,不是HaH
+ 操作符当且仅当它的操作数中至少有一个是String类型时,才会执行字符串连接操作;否则,它执行的就是加法。
例2
总结:String.valueOf、StringBuffer.append以及System.out.print中都对char[]数组单独处理,即进行了重载,使之可以输出内容(或者对内容操作处理),而不是地址。
但是字符串拼接操作没有对char[]数组单独处理,所以它处理的是数组char[]的地址
public class ABC{
public static void main(String[] args){
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.println(letters + " easy as " + numbers);
}
}
程序输出:ABC easy as [C@16f0472,而不是ABC easy as 123。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2