数组集合互相转换的时候应该注意的问题

数组转换成集合

  • 可以使用Arrays.asList()方法。

    • Integer[] a = {1,2,3,4};
      List<Integer> list = Arrays.asList(a);
      System.out.println(list);
      
      • 输出结果:image-20220508191253736,集合里存放的是单个的数字。

      • 特别注意:这里数组不能使用int[]来定义,因为集合需要指定泛型,而泛型只能是引用类型,Arrays.asList()方法返回的集合的泛型会和数组类型一致,但是如果数组类型是基本数据类型而不是引用类型,则会将整个数组int[]当成泛型类型。此时集合里的元素就不再是单个的数字,而是整个整个的数组了:

        int[] a = {1,2,3,4};
        List<int[]> list = Arrays.asList(a);
        System.out.println(list);
        
        • 输出结果:image-20220508191454595,集合里存放的是数组。
  • Arrays.asList方法返回一个List,是一个视图,它的底层仍然是数组,因此不能使用add,remove方法,因为这会改变数组大小,只能使用访问底层数组的get和修改数组元素的set方法。

    1. 修改方法set()

      Integer[] a = {1,2,3,4};
      List<Integer> list = Arrays.asList(a);
      System.out.println(list);
      list.set(0,111);
      System.out.println(list);
      
      • 结果:image-20220508191917993
    2. add()/remove()方法:

      Integer[] a = {1,2,3,4};
      List<Integer> list = Arrays.asList(a);
      list.add(1);//list.remove(1);
      
      • 结果:image-20220508192044362
    • 从源码分析:
      • 这个方法返回的是一个Arrays的内部类java.util.Arrays$ArrayList。这个内部类继承了AbstractList,而AbstractList又继承了List。因此我们得用List来接收这个结果,不能用ArrayList!!!
      • 此时我们使用返回的List类型的集合并调用这个集合的方法,在运行的时候根据动态绑定机制会去运行类型java.util.Arrays$ArrayList中调用这个方法,而java.util.Arrays$ArrayList这个类是没有add()remove()这两个方法的,因此我们调用会失败。
    • 额外:集合的subList()方法返回的视图没有操作限制,可以将任何增删改操作应用于这个视图,同时它会影响到原集合例如删除这个子视图相当于删除了元集合中的这些元素。

集合转换成数组

  • List集合的toArray()方法可以将集合转成对应类型的数组:

    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(5);
    Object[] objects1 = arrayList.toArray();//直接返回会返回一个Object类型的数组
    Integer[] integers1 = arrayList.toArray(new Integer[0]);//添加这个参数即可,下面解释
    
    • 如果直接调用toArray()将返回一个对象数组,此时由于数组的类型是不能强制转换的,即即使当前Obeject数组中的元素都是Integer类型也无法将它转换成Integer类型的数组。
    • 想要获得指定类型的数组必须在方法里new一个这种类型的数组,此时就会返回一个同类型的数组。参数中数组的长度小于集合大小会自动扩大到集合大小,长度大于集合大小多余的位置填null
    • 对返回的数组的操作不会影响到该集合:
      • image-20220508185549110
  • 数组没有类型转换,即不能将int类型的数组转换成Object类型的数组。但是集合这样是可以的:

    • List<Integer> f = new ArrayList<>();
      ArrayList<Integer> c = (ArrayList<Integer>)f;
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一酒。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值