黑马程序员技术交流社区

标题: Arrays.asList()的方法处理int[]和String[] 时的差异 [打印本页]

作者: quan23355    时间: 2013-12-2 20:02
标题: Arrays.asList()的方法处理int[]和String[] 时的差异
张老师的高新技术视频中讲到Arrays.asList()的方法处理int[]和String[] 时的差异,代码如下:
  1. int[] a1=new int[]{1,2,3};
  2. String a2=new String[]{"a","b","c"};
  3. System.out.println(Arrays.asList(a1)); //打印[[I@1cfb549]
  4.                 System.out.println(Arrays.asList(a2));        //打印[a,b,c]
复制代码
为什么会是这样的呢?我只听懂了好像是什么jdk1.4和jdk1.5的差异造成的,有那位大神能详细解释下吗?



作者: ysunday    时间: 2013-12-2 20:28
因为int[] 是一个数组,是一个object[] 类型的,所以在aslist的时候会把a1当作数组中的一个元素,
作者: ysunday    时间: 2013-12-2 20:30
而String[] 可以看成数组的数组,每个字符串也可以看作一个数组,所以在aslist的时候就被分成了你打印的结果,仅供参考,没做测试
作者: 王东旭    时间: 2013-12-2 21:26
因为虚拟机是把int[]数组当成一个对象处理的,而String[]数组里封装的是对象,所以打印出来是[a,b,c]
楼主可以试试打印Integer[] ,输出结果会是[1,2....]
作者: quan23355    时间: 2013-12-2 21:33
ysunday 发表于 2013-12-2 20:28
因为int[] 是一个数组,是一个object[] 类型的,所以在aslist的时候会把a1当作数组中的一个元素, ...

呵呵,谢谢啊,不过反复看了几遍后终于明白了。出现这种情况的原因是:在jdk1.4中,asList方法的参数类型是元素为Object类型的数组,而到了jdk1.5,asList方法的参数类型是可变参数,序列作为数组的列表。并且可以用泛型指定类型。 j dk1.5要兼容jdk1.4,会优先走jdk1.4中的方法。当传入String类型数组时,存放的是String类对象,因此会走jdk1.4中的asList方法,再把元素打散装入List集合中返回一个List集合。当传入int型数组时,由于int型是基本数据类型,不符合jdk1.4asList方法,因此走jdk1.5asList方法,jdk1.5中的方法会把整个int型数组当作一个参数,且不会打散,因为参数是可变的,当作只有一个参数,是int[]型的,打印时作为一整个数组打印hashCode值。




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