java list 数组 转换详解编程语言

说明

平常经常会用到数组、list的相互转换,但一直没有认证研究,尤其为什么Arrays.asList返回的list不能增加、删除元素,今天彻底搞懂了。

数组转list

Arrays.asList(T… a)

数组转list,使用Arrays.asList(T… a)方法

    //数组转list 
    String[] players={
  "kobe","t-mac","cp3"}; 
    //Arrays.asList返回的list是固定大小的,不能add、remove操作 
    List<String> noList = Arrays.asList(players);

注意,Arrays.asLit()返回的list是固定大小的,不能执行增加、删除操作。所以通常的做法是

List<String> yesList=  new ArrayList<String>(Arrays.asList(players));

Arrays.asList返回的list为什么不能增加、删除元素?

查看源码

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

这里用到了ArrayList,不可思议了,因为Arraylist是可以增加、删除元素的呀!为什么这里却不能?继续查看源码发现这里的ArrayList原来是Arrays的内部类ArrayList,而不是java.util.ArrayList

private static class ArrayList<E> extends AbstractList<E> 
        implements RandomAccess, java.io.Serializable 
    {
    
        private static final long serialVersionUID = -2764017481108945198L; 
        private final E[] a; 
 
        ArrayList(E[] array) { 
            if (array==null) 
                throw new NullPointerException(); 
            a = array; 
        } 
      }

Arrays$ArrayList继承自AbstractList,AbstractList的add、remove方法都抛出异常,所以不能增加、删除元素。另外,构造方法中a=array,说明,数组转换出来的list与数组,指向同一块内存。

public void add(int index, E element) { 
        throw new UnsupportedOperationException(); 
    }
 public E remove(int index) { 
        throw new UnsupportedOperationException(); 
    }

list转数组

list.toArray(T[] a)

        //list转数组 
        List<String> list2 = new ArrayList<String>(); 
        list2.add("kobe"); 
        list2.add("t-mac"); 
        list2.add("cp3"); 
        String[] arr2 = list2.toArray(new String[list2.size()]);

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20283.html

(0)
上一篇 2021年7月19日 23:19
下一篇 2021年7月19日 23:19

相关推荐

发表回复

登录后才能评论