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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ㄗ灬Night|K 中级黑马   /  2013-10-17 09:34  /  2533 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ㄗ灬Night|K 于 2013-10-17 11:11 编辑

为什么char[]打印的是ABC,而int[]打印的是哈希值呢?
  1. package itcast;

  2. public class CharInt {

  3.         public static void main(String[] args) {

  4.                 char[] ch = {'A','B','C'};
  5.                 int[] arr = {1,2,3};
  6.                
  7.                 System.out.println(ch);
  8.                 System.out.println(arr);

  9.         }

  10. }
复制代码
打印结果: ABC
                   [I@18a992f

评分

参与人数 1黑马币 +3 收起 理由
周志龙 + 3

查看全部评分

25 个回复

倒序浏览
[code]public class Array
{
        public static void main(String [] args)
        {
                String s = "printString";
                int []  i = {1,3,5,};
                char [] c = {'a', 'e', 'd'};
                System.out.println(i);
                System.out.println(c);
                System.out.println(s);
        }
}

结果:
[code][I@119dc16
aed
printString

先从字符串讲起。String是java中的一个类,所以一定会重载toString()函数,故toString()会返回其本身。所以直接打印String类的对象会输出具体字符串(就像其他所有类一样)。而字符型数组在内存中的储存方式同String类一样,故输出数组名并不是输出数组首地址,而是直接输出数组内容直到/0;而整形数组只是整形的集合,所以其数组名仅仅是其首地址,我们必须要用for循环才能完整的输出整个整形数组

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
上面的两个[code]是多余的 插代码时不知怎么出来的 忽视即可
回复 使用道具 举报
哥们如果你想输出数组内容的话有两种办法(可能更多,偶就知道这两种^^)
1.用数组工具类Arrays的toString方法
  1. System.out.println(Arrays.toString(a));
复制代码
Arrays的toString方法的实质是什么呢?用StringBuider用for循环遍历的方法将数组元素拼接起来。
  1.     public static String toString(int[] a) {
  2.         if (a == null)
  3.             return "null";
  4.         int iMax = a.length - 1;
  5.         if (iMax == -1)
  6.             return "[]";

  7.         StringBuilder b = new StringBuilder();
  8.         b.append('[');
  9.         for (int i = 0; ; i++) {
  10.             b.append(a[i]);
  11.             if (i == iMax)
  12.                 return b.append(']').toString();
  13.             b.append(", ");
  14.         }
  15.     }
复制代码
2.for循环遍历数组元素并打印。这个不用多说了。

归根结底都是用for循环遍历的。就是因为数组类型没实现万恶的toString方法

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
System.out.println(arr);把这句话改成System.out.println(Arrays.toString(arr));输出结果为:
[1,2,3]
回复 使用道具 举报
System.out.println()这个方法并没有以int[]为参数的overload 方法

所以系统认为 int[]是一个object

所以调用System.out.println(Object obj)

而打印的是obj.toString()

而obj.toString()

toString 方法返回一个字符串,由类名和 标记符“@”和此对象哈希代码的无符号十六进制表示组成。

里面相当于涉及到方法的重载
回复 使用道具 举报
本帖最后由 张文豪 于 2013-10-17 11:20 编辑

System.out指的就是PrintStream。
查看完PrintStream的API
得到PrintStream的方法中有定义println(char[] x)
它如是说:打印字符数组,然后终止该行。此方法的行为就像先调用 print(char[]) 然后调用 println() 一样。
print(char[]):打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
PrintStream方法中并没有定义println(int[] x);
所以他调用的是println(Object x)方法,它打印的是对象的字符串值(由类名+@+此对象的哈希码的无符号十六进制组成)
回复 使用道具 举报
如果楼主已经解惑,请将贴子设为提问结束
回复 使用道具 举报
To 金牌黑马 2013-10-17 14:03:44
9#
不错的回答
回复 使用道具 举报
本帖最后由 kellyzyb 于 2013-10-17 14:56 编辑
kellyzyb 发表于 2013-10-17 11:16
System.out.println()这个方法并没有以int[]为参数的overload 方法

所以系统认为 int[]是一个object


重新做了下整理和分析,希望对你有用:

System.out是一个PrintStream对象,print(println同理) 方法有N个重载,其中一个是pting(Object obj),查询api文档,此方法先调用了一个String.valueOf(obj)方法。查看此方法的源码: 当obj不等于空于时,自动调用obj.toString()方法。
  1. public static String valueOf(Object obj) {
  2. return (obj == null) ? "null" : obj.toString();
  3. }
复制代码
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())


所以当要打印整数数组时,会自动查找类型相匹配的方法进行重载,当没有对应的方法时,作为Object来处理,加载此方法 public void println(Object x) 最终打印出在内存中的地址值。
当是字符型数组时,有对应的public void print(char[] s) 方法。打印出字符串。而其它数组没有单独定义方法,当作Object来处理。
回复 使用道具 举报
顶~~~~~~~~~~~~~~~~
回复 使用道具 举报
我顶~~~~~~~~~~~~~~~~
回复 使用道具 举报
必须顶
回复 使用道具 举报
不得不顶 ~~
回复 使用道具 举报
用尽全力顶
回复 使用道具 举报
用尽全力顶
回复 使用道具 举报
再加上千斤顶
回复 使用道具 举报
总之把它顶到顶
回复 使用道具 举报
接着使出葵花宝顶
回复 使用道具 举报
就算顶到史前也要顶
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马