使用Arrays.asList 的坑(UnsupportedOperationException)

我们在工作中应该会经常使用到 Arrays.asList 方法来创建 List 对象,我们通常会认为使用这个方法创建出来的 List 是 java.util.ArrayList 类型,但其实通过这个方法创建出来的是Arrays 自己的内部类 Arrays.ArrayList ,这个方法中的 add、remove 等改变数据的结构的方法会直接抛出异常,因为在使用Arrays.ArrayList 的add、remove 等方法时会调用 AbstractList 的这些方法,而AbstractList 中的这些方法会直接抛出异常,所以我们在使用 Arrays.asList 创建的 List 时需要注意这些地方。

 

下面是 java.util.Arrays.asList(T...a)方法 和 java.util.Arrays.ArrayList 类:

public static <T> List<T> asList(T... a) { 
return new ArrayList<>(a); //这里返回的 ArrayList 就是下面这个Arrays的内部类 
} 
/** * @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) { 
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; 
} 
@Override public int indexOf(Object o) {
 E[] a = this.a; 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; 
} 
@Override 
public boolean contains(Object o) { 
return indexOf(o) != -1; 
} 
@Override 
public Spliterator<E> spliterator() { 
return Spliterators.spliterator(a, Spliterator.ORDERED); 
} 
@Override 
public void forEach(Consumer<? super E> action) {
 Objects.requireNonNull(action); 
for (E e : a) {
action.accept(e); 
} 
}
 @Override
 public void replaceAll(UnaryOperator<E> operator) { 
Objects.requireNonNull(operator); 
E[] a = this.a; 
for (int i = 0; i < a.length; i++) { 
a[i] = operator.apply(a[i]); 
} 
} 
@Override public void sort(Comparator<? super E> c) { 
Arrays.sort(a, c); 
} 
}

 

java.util.AbstractList.add() 和 remove() 方法:会直接抛出异常

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值