Collection和数组虽然都能用于存储一序列数据,但它们的适用范围却不相同,当需要保存的数据长度不固定时,用Collection比较合适,而数组长度固定,适用于长度固定的数据。有时,我们需要它们相互转换,以满足不同的需求。

 

一、Collection转数组

有时为了限定对元素的操作,需要将Collection转换为数组,从而不让使用数据的对象随意改变原有结构。

Collection转数组需要用到java.util中的Arrays.asList()方法,用以下例子演示。



@Test
    public void test01(){
        Integer [] arr = {1,2,3};    
        //数组中保存的是引用型数据类型时,数组元素作为集合中的元素保存
        List<Integer> list = Arrays.asList(arr);
        System.out.println(list);
    }



输出结果为:[1, 2, 3]

这个例子很简单,但是我们要注意下面的情形:



@Test
    public void test02(){
        int [] arr = {1,2,3};
        //数组中保存的是基本数据类型时,数组会作为集合中的元素保存
        List list = Arrays.asList(arr);
        System.out.println(list);
        }



输出结果为:[I@53fd8f9c

分析结果, [ 表明这是一维数组,I 则表示数组保存的是基本数据类型,所以list中只有一个元素,即一个一维数组。为什么会出现这种情况呢?由于泛型只支持引用型数据类型,而arr中的元素是基本数据类型,所以arr是作为一个引用保存进了list。

我们还需要注意的一个情况是,数组被转换为Collection后,不能使用Collection中的增加或删除类的方法,如add方法和remove方法.



@Test
    public void test03(){
        int [] arr = {1,2,3};
        List list = Arrays.asList(arr);
        list.add(1);
        System.out.println(list);
    }



以上代码运行后会出现 java.lang.UnsupportedOperationException 的错误,这是因为数组长度是固定的,不可能被list改变长度。

 

二、数组转Collection

数组转换为Collection之后,就可以使用Collection中的常用方法,非常方便,例如要查找数组中的某个元素,无需自己写一个遍历方法,只需调用Collection中的contains方法即可。

Collection中自带的toArray方法可以实现这一功能。



@Test
    public void test04(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        Integer [] arr01 =new Integer[5];
         Integer[]  arr =list.toArray(arr01);
        System.out.println(arr01);
        System.out.println(arr);
    }



输出结果为:

arr01[]-----[Ljava.lang.Integer;@5bb1ce68
arr[]-----[Ljava.lang.Integer;@5bb1ce68

这个结果不难理解,arr01和arr指向的都是同一个内存空间,但是如果我把数组arr01的长度 改为0会怎么样呢?



@Test
    public void test04(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        Integer [] arr01 =new Integer[0];
         Integer[]  arr =list.toArray(arr01);
        System.out.println("arr01[]-----"+arr01.toString()+"  length==" + arr01.length);
        System.out.println("arr[]-----"+arr.toString() + "  length==" + arr.length);
    }



输出结果为:

arr01[]-----[Ljava.lang.Integer;@206c4fe length==0
arr[]-----[Ljava.lang.Integer;@a6f00bc length==3

可以看出,arr01并没有保存list中的数据,因为虚拟机在发现arr01的长度低于list元素数量时,会new一个新的与之匹配长度的数组来保存数据。