Arrays.asList()
使用Arrays.asList()方法会将Array类型的数组转变为List集合形式。
package collection;
import java.util.Arrays;
import java.util.List;
public class round1 {
public static void main(String[] args) {
Integer[] arr= {1,2,3};
List<Integer> list = Arrays.asList(arr);
System.out.println(list);
list.add(4);
System.out.println(list);
}
}
执行结果当执行add()方法的时候会报错
原因是:执行Arrays.asList()方法返回的并不是我们常用的util包中的List,而是Arrays中的一个内部类,它也继承了AbstractList类,但是没有重写add()等方法,所以会报错
所以:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new Arrays.ArrayList(a);
}
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
this.a = (Object[])Objects.requireNonNull(array);
}
public int size() {
return this.a.length;
}
public Object[] toArray() {
return Arrays.copyOf(this.a, this.a.length, Object[].class);
}
public <T> T[] toArray(T[] a) {
int size = this.size();
if (a.length < size) {
return Arrays.copyOf(this.a, size, a.getClass());
} else {
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size) {
a[size] = null;
}
return a;
}
}
public E get(int index) {
return this.a[index];
}
.......
}
ArrayList.subList()
ArrayList.subList()的常用情况:
List<String> numlist = new ArrayList<>();
numlist.add("0");
numlist.add("1");
numlist.add("2");
numlist.add("3");
numlist.add("4");
numlist.add("5");
numlist.add("6");
List<String> subNumList = numlist.subList(2,4);
System.out.println(numlist);
System.out.println(subNumList);
从结果不难看出ArrayList.subList()是包含头不包含尾的。
但是使用时需要注意几点:
- 当修改主List的内容时,子List也会受到影响
- 当修改主List的结构的时候,会引起
ConcurrentModificationException
异常 - 当修改子List的内容的时候,主List也会受影响
- 当修改子List的结构的时候,主List也会受影响
一、当修改主List的内容时,子List也会受到影响
List<String> numlist = new ArrayList<>();
numlist.add("0");
numlist.add("1");
numlist.add("2");
numlist.add("3");
numlist.add("4");
numlist.add("5");
numlist.add("6");
List<String> subNumList = numlist.subList(2,4);
System.out.println(numlist);
System.out.println(subNumList);
numlist.set(2,"222");
System.out.println(numlist);
System.out.println(subNumList);
、
二、当修改主List的结构的时候,会引起ConcurrentModificationException
异常
List<String> numlist = new ArrayList<>();
numlist.add("0");
numlist.add("1");
numlist.add("2");
numlist.add("3");
numlist.add("4");
numlist.add("5");
numlist.add("6");
List<String> subNumList = numlist.subList(2,4);
System.out.println(numlist);
System.out.println(subNumList);
numlist.add("7");
System.out.println(numlist);
System.out.println(subNumList);
三、当修改子List的内容的时候,主List也会受影响
List<String> numlist = new ArrayList<>();
numlist.add("0");
numlist.add("1");
numlist.add("2");
numlist.add("3");
numlist.add("4");
numlist.add("5");
numlist.add("6");
List<String> subNumList = numlist.subList(2,4);
System.out.println(numlist);
System.out.println(subNumList);
subNumList.set(0,"2222");
System.out.println(numlist);
System.out.println(subNumList);
四、当修改子List的结构的时候,主List也会受影响
List<String> numlist = new ArrayList<>();
numlist.add("0");
numlist.add("1");
numlist.add("2");
numlist.add("3");
numlist.add("4");
numlist.add("5");
numlist.add("6");
List<String> subNumList = numlist.subList(2,4);
System.out.println(numlist);
System.out.println(subNumList);
subNumList.add("777");
System.out.println(numlist);
System.out.println(subNumList);
总结
ArrayList的subList方法,返回的是原集合的一个子集合,非结构性修改任意一个集合的元素的值,都会彼此影响,结构性修改原集合时,会报ConcurrentModificationException
异常,结构性修改子集合时,会影响原集合,所以使用时要注意,避免程序错误或者异常。