黑马程序员技术交流社区

标题: 打印字符数组的问题 [打印本页]

作者: 刘云龙    时间: 2013-3-4 23:30
标题: 打印字符数组的问题
  1. class Question
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 char[] arr = {'a','b','c','d','e'};
  6.                 System.out.println(arr);//打印abcde
  7.                 int [] arr1 = {1,2,3,4,5};
  8.                 System.out.println(arr1);//打印[I@5e55ab

  9.         }
  10. }
复制代码
结果是
abcde
[I@5e55ab
为什么字符数组不是打印的数组的地址?
作者: lzw123451    时间: 2013-3-5 00:31
本帖最后由 李志卫 于 2013-3-5 02:23 编辑

特别优待
看下面代码,你会发现char[]数组并没有重写toString方法
  1. class Test14
  2. {
  3. public static void main(String[] args)
  4. {
  5. String s = "abc";
  6. byte[] b = s.getBytes();
  7. System.out.println(b.toString());
  8. System.out.println(new String(b));

  9. char[] arr = {'a','b','c','d','e'};

  10. System.out.println(arr);
  11. System.out.println(arr.toString());   // 结果是 [C@1fc4bec

  12. int [] arr1 = {1,2,3,4,5};

  13. System.out.println(arr1.toString());






  14. }
  15. }
复制代码

作者: 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