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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王建雨 黑马帝   /  2012-2-9 09:55  /  2729 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王建雨 于 2012-2-9 19:54 编辑

这段代码
import java.util.Arrays;
public class AsListTest {
        public static void main(String [] args){
                int [] a1= new int[]{1,2,3};
                Object [] a2 = new Object []{1,2,3};
                Object  a3 = a1;
                Object [] a4 = new Object[]{a1,a2};
                System.out.println("a1:"+Arrays.asList(a1));
                System.out.println("a2:"+Arrays.asList(a2));
                System.out.println("a3:"+Arrays.asList(a3));
                System.out.println("a4:"+Arrays.asList(a4));
        }
}
打印出的结果是:
a1:[[I@1bab50a]
a2:[1, 2, 3]
a3:[[I@1bab50a]
a4:[[I@1bab50a, [Ljava.lang.Object;@c3c749]
我的问题是:
a1没有被Arrays.asList()处理,是因为Arrays.asList()只能处理Object类型的,那么请问
1.a2和a3都是Object类型的,为什么Arrays.asList()只处理了a2,没有处理a3?
2.a4的声明方式跟a2一样,为什么也没有被Arrays.asList()处理呢?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

6 个回复

倒序浏览
JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[]。所以,在1.4中asList()并不支持基本类型的数组作参数。
JDK 1.5中,java.util.Arrays.asList的定义,函数参数是Varargs, 采用了泛型实现。同时由于autoboxing的支持,使得可以支持对象数组以及基本类型数组。
不过在使用时,当传入基本数据类型的数组时,会出现小问题,会把传入的数组整个当作返回的List中的第一个元素,例如:

public static void main(String[] args){
    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));
}

  

打印结果如下:

2 [[I@dc8569]
[a, b, c]

评分

参与人数 1技术分 +1 收起 理由
admin + 1 加分鼓励!

查看全部评分

回复 使用道具 举报
public static <T> List<T> asList(T... a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:

     List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

参数:
a - 支持列表的数组。
返回:
指定数组的列表视图。
应该每个对象都处理了,返回的是对象在堆内存的哈希值地址

评分

参与人数 1技术分 +1 收起 理由
admin + 1 加分鼓励!

查看全部评分

回复 使用道具 举报
林铁柱 发表于 2012-2-9 10:26
JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[]。所以,在1.4中asList()并不支持基本类型的 ...

这个,我懂,可是我问的不是这个,我是不理解,我这么做为什么不打印出数组中的元素!!
回复 使用道具 举报
李泽霖 发表于 2012-2-9 10:27
public static  List asList(T... a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接 ...

跟2楼的一样没有解决我的疑问!:Q
回复 使用道具 举报
本帖最后由 王_涛 于 2012-2-9 12:08 编辑

上面的问题都被Arrays.asList(T... a)处理了。根据参数的不同(是支持列表的数组还是对象)输出的表现不同。
具体分析往下看:

问题1. a1没有被Arrays.asList()处理,是因为Arrays.asList()只能处理Object类型的,

答:API 中 public static <T> List<T> asList(T... a)
      a - 支持列表的数组。
    明确一点数组是对象
a1是一个int类型的数组对象,是不支持列表的数组。
因为,列表内只能存放对象不能存放基本类型。而a1存放的是基本类型。
所以,a1被当做一个对象存入List中,此时List中只有一个元素。
调用System.out.println("a1:"+Arrays.asList(a1));List列表输出时元素a1调用a1.toString();


问题2. a2和a3都是Object类型的,为什么Arrays.asList()只处理了a2,没有处理a3?

答:a2是支持列表的数组
a2被当做一个对象数组存入List中,List中有三个元素1,2,3。
调用System.out.println("a2:"+Arrays.asList(a2));List列表输出时元素Integer类型的1调用Integer.valueOf(1).toString();
以此类推...Integer.valueOf(2).toString(); Integer.valueOf(3).toString());
a3是Object类型的对象,不是数组。
所以,a3被当做一个对象存入List中,此时List中只有一个元素。
调用System.out.println("a3:"+Arrays.asList(a3));List列表输出时元素a3调用a3.toString();


问题3. a4的声明方式跟a2一样,为什么也没有被Arrays.asList()处理呢?

答:a4是支持列表的数组
a4被当做一个对象数组存入List中,List中有两个元素a1,a2。
调用System.out.println("a2:"+Arrays.asList(a2));List列表输出时元素a1调用a1.toString();
输出时元素a2调用a2.toString();

评分

参与人数 2技术分 +3 黑马币 +5 收起 理由
admin + 3 虽然我没看,但是看了评论,加分必须的!.
王建雨 + 5 很好,很明白!传说中的大虾........

查看全部评分

回复 使用道具 举报
黄秋 黑马帝 2012-2-9 19:29:30
7#
本来楼上说得够清楚详细,不应再啰嗦。但大家还忽略一点,就是JDK5 开始,能自动拆箱、装箱。这个只是对于基本数据类型的,但对于基本数据类型构成的数组,不会进行,--- JDK不会对数组进行自动数据转换
  1. int [] a1= new int[]{1,2,3};
  2.                  Integer[] a2= new Integer[]{1,2,3};
  3.                  int a3=3;
  4.                 System.out.println(Arrays.asList(a1));
  5.                 System.out.println(Arrays.asList(a2));
  6.                 System.out.println(Arrays.asList(a3));
  7.                 System.out.println(Arrays.asList(1));
复制代码
输出:
[[I@de6ced]
[1, 2, 3]
[3]
[1]

Integer[] 可以,因为数组里面已是Integer 包装类,
“a3=3” 也行,因一个int 可以转换成对应的包装类-- Integer ,
单独一个数:1,也行,理由同上,
int[] a1 不行了,它是基本数据类型构成的数组,JDK5 以前是肯定不行,但现在呢?现在JDK也不会对数组进行自动数据转换,故不行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马