数组和集合之间的相互转换

        刷算法题经常需要用到数组和集合之间的相互转换,里面包含不少注意事项,这里做一个总结。

1、集合转换为数组

        用List.toArray(T[] a)方法,代码如下:

public class Main {
    public static void main(String[] args) throws Exception {
        //创建一个包含元素1,2,3的list
        ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
        //将ArrayList<Integer>转换为Integer []
        Integer[] array = list.toArray(new Integer[0]);
        for (Integer i: array) {
            System.out.println(i);
        }
    }
}

        运行结果:

1
2
3

        注意,在这个案例中,list.toArray(new Integer[0]) 方法中传递的参数可以为new Integer[0]new Integer[1]new Integer[2]new Integer[3],但是传递的数组长度不能大于3。例如传递参数为new Integer[4],运行结果为:

1
2
3
null

        另外,数组类型必须是Integer,不能是int类型,否则会报错。

2、数组转换为集合

        用Arrays.asList(T... a)方法,代码如下:

public class Main {
    public static void main(String[] args) throws Exception {
        Integer[] array = {1, 2, 3};
        List<Integer> list = Arrays.asList(array);
        System.out.println(list);
    }
}

        运行结果:

[1, 2, 3]

        此外,还可以使用 List.of(),结果和上述一样。

public class Main {
    public static void main(String[] args) throws Exception {
        Integer[] array = {1, 2, 3};
        List<Integer> list = List.of(array);
        System.out.println(list);
    }
}

        注意,这里的list是定长的,不可以使用add()方法增加元素

public class Main {
    public static void main(String[] args) throws Exception {
        Integer[] array = {1, 2, 3};
        List<Integer> list = Arrays.asList(array);//或者List.of(array)
        list.add(4);
        System.out.println(list);
    }
}

        上述代码会出现UnsupportedOperationException异常:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
	at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:147)
	at com.company.Main.main(Main.java:9)

        如果我们需要增加元素怎么办呢?可以借助List的构造方法来实现:

public class Main {
    public static void main(String[] args) throws Exception {
        Integer[] array = {1, 2, 3};
        List<Integer> list = new ArrayList<>(Arrays.asList(array));
        list.add(4);
        System.out.println(list);
    }
}

这样就不会报错了,结果如下:

[1, 2, 3, 4]

        我们来看一下Arrays.asList(T... a)的源码:

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

返回的实际类型是ArrayList,但是只能用List来接收结果。至于为什么这个返回的结果不能add(),是因为这个ArrayList不是我们平时用的ArrayList吗,而是Arrays里面的一个内部类。而且这个内部类没有add,clear,remove方法,所以抛出的异常其实来自于AbstractList

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值