方法:使用Collections.unmodifiableXXX(XXX)
上述的不能修改方法有以下几个:
至于里面的原理,我们用unmodifiableCollection()方法来具体说明,我们点进unmodifiableCollection()方法,代码如下:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}
说明返回的是UnmodifiableCollection类
,我们点击该类后找到该类,现在来看里面的修改方法,如下:
public boolean add(E e) {
throw new UnsupportedOperationException();
}
public boolean remove(Object o) {
throw new UnsupportedOperationException();
}
…………
可以看出UnmodifiableCollection类
中所有的修改方法都会抛出异常,因此通过Collections.unmodifiableXXX(XXX)创建出来的集合不能被修改
使用举例:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
// unmodifiableList中的元素就不能修改了
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
}
}
辟谣:Arrays.asList(XXX)生成的集合不能被修改!
我们点击asList()方法进入该工具类中的方法,代码如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
大家一看ArrayList肯定就会想到List接口的实现类ArrayList,其实Arrays工具类中的ArrayList是个内部类,代码如下:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
{
………………
}
我们来看一下该内部类ArrayList中的set方法,如下:
@Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
@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]);
}
}
可以看到里面集合被改变了,是不是没有看到add()方法,从上述代码中可以看到ArrayList继承AbstractList类,那add()方法肯定来源于AbstractList类,我们来看一下该类中的add()方法,代码如下:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
可以看到add()方法确实抛出了异常,不过上面已经说明了set()和replaceAll()方法可以正常工作,不会抛出异常,因此Arrays.asList()方法不能保证集合不被修改