A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© amen0205 中级黑马   /  2013-3-5 02:45  /  3263 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 门文通 于 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

谁能解释下?

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

8 个回复

倒序浏览
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 [ ]显式转换为字符串
回复 使用道具 举报
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();
        }
    }

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
这个问题我以前遇到过,我来讲讲
  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-8 03:58
回复 使用道具 举报
System.out.println("arr"+arr);//
此处打印的是字符串,任何对象和字符串连接都转为字符串,arr是数组引用,其字符串表示形式就是arr.toString();相当于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
克零岚 发表于 2013-3-5 10:30
这个问题我以前遇到过,我来讲讲

明白了 谢谢
回复 使用道具 举报
陈圳 发表于 2013-3-5 07:55
char[]  arr={'a','b','c','d','e'};
                System.out.println(arr); //打印结果为abcde这里是将字符数组,转 ...

我编译真没警告
回复 使用道具 举报
门文通 发表于 2013-3-8 03:56
我编译真没警告

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

哦  知道了  我回头试试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马