我们都知道,Collection接口的子接口List,有两个实现类,ArrayList和LinkedList,而以数组作为数据结构的集合是哪一个呢?答案当然是ArrayList喽,本篇我们来探讨一个问题,就是ArrayList和数组的互转问题。
1、数组转集合。
在操作数组的工具类Arrays中,有个静态方法如下:
Arrays.asList(T... a);
返回由指定数组支持的固定大小的列表。
来一段代码测试一下:
String[] array = new String[3];
array[0] = "zhangsan";
array[1] = "lisi";
array[2] = "wangwu";
//数组转集合的操作
List<String> list = Arrays.asList(array);
哇,看起来真的简单,然后,咋们就开始各种“疯狂”的操作,
//按照索引取出该位置的值
System.out.println(list.get(0));
//添加元素
list.add(3,"zhaoliu");
//删除元素
list.remove(1);
//打印集合中的元素
System.out.println(list);
运行一下呗,期待控制台输出心里想好的结果。。。。
zhangsan
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at Test.main(Test.java:64)
what??? 我反复检查代码,这么简单的代码都会写错,不会吧,没什么错啊(其实有点过了,但是刚开始确实有点不理解,嘿嘿),况且这个异常UnsupportedOperationException类之前也没遇到过啊。。。。。。
究竟怎么一回事呢,让我们来看看,一怒之下,点开了asList方法的源代码,显示如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
不也是返回一个ArrayList吗?但是仔细一看,你会发现,java.util.ArrayList类也没有个参数为数组的构造器啊,然后我再点进去看这个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) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
@Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
@Override
public E get(int index) {
return a[index];
}
@Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
}
这个类居然是Arrays类的静态内部类,还可以发现,里面根本就没有像我们操作java.util.ArrayList类里面的add(),remove()等的方法,只有get(),set()等方法,是不是有点豁然开朗的感觉,看到阿里巴巴出的那本《码出高效》中对类的形容:李鬼,再形象不过了,此ArrayList非彼ArrayList,哈哈哈,但是还有点不明白的是,这个异常UnsupportedOperationException从哪儿抛出啊,此“李鬼”类继承自AbstractList,点开发现:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
原来如此啊,看来不能瞎操作啊!!!
但是你可以这么玩:
List<String> lists = new ArrayList<>(Arrays.asList(array));
lists.add("heisi");
System.out.println(lists);
这样就可以操作了。哇,不敲不知道,一敲吓一跳啊。
2、集合转数组
这么转就可以了:
String[] arr = new String[lists.size()];
arr = lists.toArray(arr);
System.out.println(arr.length);