List.remove()有两个:
一个 public E remove(int index);
一个 public boolean remove(Object o);
如果按照数组下标删除,则返回删除的值,
如果按照数组对象删除,则返回true or flase
这个方法是删除第一个Obejct
1.遍历移除list
public static void main(String[] args) {
List<Integer> array = new ArrayList<>();
array.add(0);
array.add(1);
array.add(2);
array.add(3);
array.add(2);
array.add(4);
array.remove(Integer.valueOf(2)); // 对象删除
System.out.println(array);
}
输出结果 [0, 1, 3, 2, 4] ,这里是按照对象删除。
public static void main(String[] args) {
List<Integer> array = new ArrayList<>();
array.add(0);
array.add(1);
array.add(2);
array.add(3);
array.add(2);
array.add(4);
array.remove(2); // 下标删除
System.out.println(array);
}
输出结果 [0, 1, 3, 2, 4]这里是按照下标删除。
List<Integer> integers = new ArrayList<>(5);
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
for (int i = 0; i < integers.size(); i++) {
if (integers.get(i)%2==0){
integers.remove(i);
}
}
System.out.println(integers);
结果是[1, 2, 5]
注意两点:integers.size()的大小会变化, remove 是按照数组下标来删除的,
在移动的时候,单移除第一个2是,list数组会将后面所有的数据都向前移动一位,正好将第二个2先前移动了,没有遍历到。解决方法如下:
List<Integer> integers = new ArrayList<Integer>();
integers.add(1);
integers.add(2);
integers.add(2);
integers.add(4);
integers.add(5);
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next % 2==0) {
iterator.remove();
}
}
System.out.println(integers);
结果是[1, 5],使用迭代器来遍历。
2.经常会使用一个Arrays.asList的API, 那么下面的结果是什么:
List<String> list = Arrays.asList("a","b");
list.add("c");
System.out.println(list)
- 报错: java.lang.UnsupportedOperationException
原因:
为什么Java里的Arrays.asList()返回的List不能使用add、remove方法?
通过源码我们发现,Arrays.asList()方法返回的ArrayList继承自AbstractList,同时实现了RandomAccess和Serializable接口。如下所示:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
问题就出在这里。这个ArrayList不是java.util包下的,而是 java.util.Arrays.ArrayList,显然它是Arrays类自己定义的一个内部类!这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。
那我们接着看这个AbstractList,定义如下:
public abstract class AbstractList<E> extends AbstractCollection<E>
implements List<E>
我们再来看一下里面的set,add,remove方法,定义如下:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
全都返回了这个异常。
总结:Arrays.asList()返回的ArrayList继承自AbstractList,它仅支持那些不会改变数组大小的操作,所以任何对底层数据结构的尺寸进行修改的方法都会出现异常,Arrays.asList()返回固定尺寸的List。