黑马程序员技术交流社区

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

作者: amen0205    时间: 2013-3-5 02:45
标题: 关于打印字符数组的问题
本帖最后由 门文通 于 2013-3-8 03:50 编辑

char[]  arr={'a','b','c','d','e'};
System.out.println(arr); //打印结果为abcde

int[]  arr1={1,2,3,4,5};
System.out.println(arr1);//结果是[I@de6ced

这是刚才一个同学的问题?
我新的问题是:  当打印 System.out.println("arr"+arr);//此时结果为 arr [C@de6ced

谁能解释下?

作者: 陈圳    时间: 2013-3-5 07:55
char[]  arr={'a','b','c','d','e'};
                System.out.println(arr); //打印结果为abcde这里是将字符数组,转换为字符串了.||这里打印相当于new String(arr)
               
                int[]  arr1={1,2,3,4,5};
                System.out.println(arr1);//结果是[I@de6ced 整型数组只能打印I@+哈希值.
                System.out.println("arr"+arr);//这里有编译警告的:Must explicitly convert the char[] to a String:必须char [ ]显式转换为字符串
作者: 谢达    时间: 2013-3-5 09:36
Out是PrintStream对象,PrintStream中对println()进行了重载
char[]  arr={'a','b','c','d','e'};调用的是这个方法,
public void println(char x[]) {
        synchronized (this) {
            print(x);  //此处底层调用的是Writer的void write(char[] cbuf)写入字符数组                  }
    }

int[]  arr1={1,2,3,4,5};//因为有对应char数组类型的方法,而无对应 int数组类型方法,而数组本身是引用对象所有会调用下面的方法
public void println(Object x) {
        String s = String.valueOf(x);  //x调用toString()方法所以返回I@de6ced ,所以结构就是arr[I@de6ced
    }
        synchronized (this) {
            print(s);
            newLine();
        }
    }

作者: 克零岚    时间: 2013-3-5 10:30
这个问题我以前遇到过,我来讲讲
  1. 例子一枚,请看:
  2. public class Test{   
  3. public static void main(String[] args){        
  4. System.out.print("H"+"a");        
  5. System.out.print('H'+'a');   
  6. }
  7. }

  8. 运行结果是Ha169,不是HaH。
  9. 说明<font color="red" size="4">:+ 操作符当且仅当它的操作数中至少有一个是String类型时,才会执行字符串连接操作</font>;否则,它执行的就是加法。


  10. 那么在看这个例子:
  11. public class Test1{
  12. public static void main(String[] args){
  13. String s = "ABC";
  14. char[] c = {'1', '2', '3'};
  15. System.out.println(s + " and " + c);
  16. }
  17. }
  18. 程序输出:ABC and [C@16f0472,而不是ABC and 123。
  19. 重点来了,呵呵,原因:String.valueOf、StringBuffer.append以及<font color="red" size="4">System.out.print中都对char[]数组单独处理,即进行了重载,使之可以输出内容(或者对内容操作处理),而不是地址,但是字符串拼接操作没有对char[]数组单独处理,所以它处理的是数组char[]的地址

  20. 这样解释,还算清楚吧?


  21. </font>

复制代码

作者: 王亚东    时间: 2013-3-5 14:19
System.out.println("arr"+arr);//
此处打印的是字符串,任何对象和字符串连接都转为字符串,arr是数组引用,其字符串表示形式就是arr.toString();相当于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

作者: amen0205    时间: 2013-3-8 03:50
克零岚 发表于 2013-3-5 10:30
这个问题我以前遇到过,我来讲讲

明白了 谢谢
作者: amen0205    时间: 2013-3-8 03:56
陈圳 发表于 2013-3-5 07:55
char[]  arr={'a','b','c','d','e'};
                System.out.println(arr); //打印结果为abcde这里是将字符数组,转 ...

我编译真没警告
作者: 陈圳    时间: 2013-3-8 09:23
门文通 发表于 2013-3-8 03:56
我编译真没警告

如果你用eclipse你就会明白了,对于你建的变量没有使用,或是允许但是有问题的语句,比如说对象调用静态成员,或方法,都允许运行,但是会警告.
作者: amen0205    时间: 2013-3-8 18:29
陈圳 发表于 2013-3-8 09:23
如果你用eclipse你就会明白了,对于你建的变量没有使用,或是允许但是有问题的语句,比如说对象调用静态成员 ...

哦  知道了  我回头试试




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2