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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @ne_pie尒ce 中级黑马   /  2013-11-7 13:34  /  1482 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

定义了两个数组:
int[] a1=new int[]{1,2,3};
       String[] a2=new String[]{"a","b","c"};
       System.out.println(Arrays.asList(a1));
       System.out.println(Arrays.asList(a2));



输出结果:
[[I@d42d08]
[a, b, c]
请详细分析一下?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

倒序浏览
String 类重写了toString 方法
回复 使用道具 举报
楼主,首先你得代码有错误,其次,你应该用的是基本数据的包装类,因为(Arrays.asList(a1)返回的是一个受指定数组支持的固定大小的列表 List<T> 其中的T不能是基本数据类,必须是他的包装类,你换成Integer就行了。
  1. Integer[] a1={1,2,3};
  2.          String[] a2=new String[]{"a","b","c"};
  3.          System.out.println(Arrays.asList(a1));
  4.          System.out.println(Arrays.asList(a2));
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
很好理解  集合只能存储对象, 你int数组是一个基本数据类型,转成集合时,是把int[]数组作为对象存储进集合的,如果你定义为Integer[],打印的就是[1, 2, 3]。数组存储类型为对象,集合才会存储对象的
int[] arr = new int[3];
List<int[]> l =Arrays.asList(arr);
Integer[] arr = new Integer[3];
List<Integer> l =Arrays.asList(arr);

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
基本数据类型包装类,int对应的是Integer,当int[] a1=new int[]{1,2,3};这样定义时,是建立一个al数组,里面包含数组元素1,2,3,al存放在栈内存中,对应的元素存放在堆内存中,当System.out.println(Arrays.asList(a1));打印的时候,是打印al的引用,即al的指向向的堆内存的地址值,也就是说,上面代码定义本来就错误,应该Integer[] a1={1,2,3};这样定义。运行后就不会出现错误。
import java.util.*;
class Demo

{

        public static void main(String[] args)
        {
        Integer[] a1={1,2,3};
       String[] a2=new String[]{"a","b","c"};
       System.out.println(Arrays.asList(a1));
       System.out.println(Arrays.asList(a2));
        }

}
比如我写的这个代码就可以,有一点,必须导入Arrays包才行
import java.util.*;这样导入可以
import java.util.Arrays;这样也可以

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
这个倒不算是错误,
因为JDK1.5 加入了可变参数,
所以 Arays.asList(T... a) 如果传入的参数是基本类型的数组,
会被解读成一个Object对象并将之存入一个对象数组
这个在张老师的课里有讲到,
Arrays.asList(a1) 的返回值相当于 new List<int[]> list = { a1 };
所以System.out.println(Arrays.asList(a1))就相当于Syso{a1};

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
   基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。Arrays.asList()这个方法有两种形式,
老版本(应该是1.5之前,因为可变参数是1.5的新特性):static <T> List<T> asList(Object[] arr)
新版本:static <T> List<T> asList(T... a)
System.out.println(Arrays.asList(a1));这个a1被当做一个Object子类对象,使用的新版本可变参数。这个地方a1是一个数组,但它是基本类型,不能当做一个Object[]类型使用,就上面说的,那它就只能当做Object类型使用了。另外它没有复写Object的toString方法,所以使用继承Object的toString方法,返回一个哈希值。
System.out.println(Arrays.asList(a2));按我的看法,这里如果a2当做Object(前面说了可以),那肯定是调用新版本的asList方法了,因为String复写了toString,所以我也不确定,此时应该返回一个哈希值吧?不过这不影响,因为这里的a2是被当做一个Object[],使用的老版本的asList。然后输出每个元素的时候,里面的每个元素时String类型的,在toString(将元素转换成字符串表现形式)的时候,因为多态调用了String的toString方法。

评分

参与人数 2技术分 +2 收起 理由
乔兵 + 1
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马