黑马程序员技术交流社区
标题:
关于用Arrays工具类中的asList方法将数组变成集合问题
[打印本页]
作者:
Candy
时间:
2013-7-22 16:32
标题:
关于用Arrays工具类中的asList方法将数组变成集合问题
本帖最后由 杨兴庭 于 2013-7-23 17:01 编辑
用集合框架工具类中的Collections.toArray()将集合变成数组后对其进行了限制(不能进行增删)
但是通过
List<Integer> list=Arrays.asList(arr);将数组变成了集合,就应该有集合的特性,但是为什么java不能对其进行增删操作
求帮助,求救!!
作者:
王磊
时间:
2013-7-22 18:13
API上有说明:
public static <T> List<T> asList(T... a)
返回一个受指定数组支持的固定大小的列表。(
对返回列表的更改会“直接写”到数组。
)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
红色字体的文字可以看出,asList并不是将一个数组变成集合,而是获取到该数组的一个映射关系,也就是说使用一个集合来表示这个数组,这是对这个集合的操作,就相当于对数组的操作,由于JAVA中的数组长度是固定不变的,所以如果使用集合的增删方法,会使数组的长度发生改变,所以不可以进行增删操作。
简单的说,asList方法只是让操作者以集合的思想去操作数组,最后操作的仍然是数组,而不是集合。
希望对楼主有所帮助。
作者:
张强1
时间:
2013-7-22 22:22
我今天也看了这个,我是这样理解的:
List<Integer> list=Arrays.asList(arr);将数组变成了集合。只是将映射关系加到了集合中,而其实际操作还是和数组产生联系了,而数组是不可以增删的,所以java中也就不可以对这方法进行增删操作了。
作者:
yangqing
时间:
2013-7-23 01:10
。。。我想说的和楼上差不多。。、
作者:
toShareBeauty
时间:
2013-7-23 02:08
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
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;
}
public int size() {
return a.length;
}
public Object[] toArray() {
return a.clone();
}
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;
}
public E get(int index) {
return a[index];
}
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
public int indexOf(Object o) {
if (o==null) {
for (int i=0; i<a.length; i++)
if (a[i]==null)
return i;
} else {
for (int i=0; i<a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
public boolean contains(Object o) {
return indexOf(o) != -1;
}
}
复制代码
这是源码,可以知道 Arrays 中 asList 方法返回的是 ArrayList 类型的对象,但是这个 ArrayList 类型是 Arrays 中的成员内部类,它只是扩展了 AbstractArrayList 类,从 AbstractArrayList 类的源码可以知道,该类不支持 add 和 remove 方法,调用这两个方法会抛出异常 UnsupportedOperationException();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2