关于List和数组转化问题

回过头来复习Java基础的时候,发现当初这一块有很多细节都没有掌握到,现在记录下来,以更好的夯实基础

List转数组

第一种方式是以无参形式直接返回一个Object[]类型的数组,不过这种方法会导致丢失类型信息,故使用较少。

public class Main {

    public static void main(String[] args) {

    List list=new ArrayList();

    list.add(1);

    list.add(2);

    list.add(3);

    list.add(4);

    Object[] integer=list.toArray();

    System.out.println(integer.getClass());

    for (int i=0;i<integer.length;i++){

        System.out.println(i);

    }

    }

}

输出结果

0

1

2

3

class [Ljava.lang.Object;

第二种方式是给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中:

public class Main {

    public static void main(String[] args) {

    List<Integer> list=new ArrayList<>();

    list.add(3);

    list.add(1);

    Integer[] idex=list.toArray(new Integer[3]);

    for (Integer i:idex){

        System.out.println(i);

    }

    }

}

输出结果:

3

1

null

这种方式有两个注意点:

1、传入数组大小问题。当传入的数组不够大时,List内部会创建一个刚好足够大的数组,填充后返回,当传入的数组比List元素还要多的时候,填充完元素,剩下的一律为null。

最好的方法是

Integer[] idex=list.toArray(newInteger[list.size()])

2、传入类型匹配问题。

    <T> T[] toArray(T[] a);

toArray中的泛型通配符为T,所以可以传入其他类型的数组。以Number类型为例:

public class Main {

    public static void main(String[] args) {

        List<Integer> list=new ArrayList<>();

        list.add(3);

        list.add(1);

        Number[] idex=list.toArray(new Number[3]);

        for (Number i:idex){

            System.out.println(i);

        }

    }

}

输出结果

3

1

null

若类型不匹配,则抛出ArrayStoreException异常。

public class Main {

    public static void main(String[] args) {

        List<Integer> list=new ArrayList<>();

        list.add(3);

        list.add(1);

        Float[] idex=list.toArray(new Float[3]);

        for (Float i:idex){

            System.out.println(i);

        }

    }

}

Exception in thread "main" java.lang.ArrayStoreException


数组转List

数组转换为集合使用的是数组的工具类Arrays的静态方法asList。查看API文档可知该方法返回由指定数组支持的固定大小的列表。

public class Main {

    public static void main(String[] args) {

        String[] name=new String[]{"Enoch","Star"};

        List<String> list=Arrays.asList(name);

        System.out.println(list);

    }

}

输出结果:

[Enoch, Star]

需要注意的是,返回的List不一定就是ArrayList或是LinkedList,该接口返回的是一个只读的List。

当对其调用add()、remove()会抛出UnsupportedOperationException。

因为这个新集合是由数组转换过来的,那么该集合就表示原来的数组,所以对集合的操作就是对数组的操作。那么添加元素会导致原数组扩容,那么就不能表示原来的数组了。所以不允许向该集合添加新元素了。

例:

public class Main {

    public static void main(String[] args) {

        String[] name=new String[]{"Enoch","Star"};

        List<String> list=Arrays.asList(name);

        System.out.println(list);

        list.set(0,"cool");

        System.out.println(list);

        list.add("cool");

    }

}

输出结果

[Enoch, Star]

[cool, Star]

Exception in thread "main" java.lang.UnsupportedOperationException

at java.util.AbstractList.add(AbstractList.java:148)

at java.util.AbstractList.add(AbstractList.java:108)

那么如何实现添加元素这类功能?

我们通过实验知道数组转化为List是不能增删数据的,如果需要增删,可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。

public class Main {

    public static void main(String[] args) {

        String[] name=new String[]{"Enoch","Star"};

        List<String> list=Arrays.asList(name);

        List<String> newList=new ArrayList<>();

        newList.addAll(list);

        System.out.println(newList);

        newList.add("cool");

        System.out.println(newList);

    }

}

或

public class Main {

    public static void main(String[] args) {

        String[] name=new String[]{"Enoch","Star"};

        List<String> list=Arrays.asList(name);

        List<String> newList=new ArrayList<>(list);

        System.out.println(newList);

        newList.add("cool");

        System.out.println(newList);

    }

}

输出结果

[Enoch, Star]

[Enoch, Star, cool]

以上内容都是我自己的一些感想,分享出来欢迎大家指正,顺便求一波关注,有想法的伙伴可以评论或者私信我哦~


作者:不二鑫

出处:https://juejin.im/post/5e58cf52518825490f722d2d

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,475评论 0赞 3
  • 一、为什么会出现集合类 1.集合是一个容器,为了方便的对多个对象进行操作。 2.集合容器同数组容器的...
    大禹编程扛把子阅读 678评论 0赞 0
  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,742评论 0赞 9
  • /*【程序21】 * 作者 南枫题目:求1+2!+3!+...+20!的和 1. 程序分析:此程序只是把累加变成了...
    HUC南枫阅读 539评论 0赞 0
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 7,355评论 0赞 9

友情链接更多精彩内容