【笔记】Collection与数组互转

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一个新的与之匹配长度的数组来保存数据。

 

 

 

 

 

转载于:https://www.cnblogs.com/just2do/p/3265095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值