subList:
ArrayList的subList结果不可强转成ArrayList。
原因: subList返回的是ArrayList的内部类SubList,它并不是ArrayList而是ArrayList的一个视图,所以直接强转ArrayList会报错。
在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException异常。
toArray()方法:
无参: 返回结果是Object[]类,不可强转为其它类型数组,但是通过Arrays.toString可输出基本类型的结果。
有参toArray(T[] array): 将集合内的元素给array赋值,如果array不够大,则将array置空,重新分配内存,返回一个赋值好的新数组。而array过大时,多余元素为null。
示例:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
String[] strings1 = new String[1],strings2 = new String[2],strings3 = new String[3];
list.toArray(strings1);
System.out.println("strings1:" + Arrays.toString(strings1));
strings1 = list.toArray(strings1);
System.out.println("strings1:" + Arrays.toString(strings1));
list.toArray(strings2);
System.out.println("strings2:" + Arrays.toString(strings2));
list.toArray(strings3);
System.out.println("strings3:" + Arrays.toString(strings3));
输出:
日常使用应该为:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
String[] strArray = new String[list.size()];
strArray = list.toArray(strArray);
Arrays.asList():
使用Arrays.asList()将数组转化为集合时,不能使用修改集合相关的方法(add/remove/clear),否则会导致UnsupportedOperationException异常
原因: asList()方法返回的集合ArrayList是Arrays的内部类,并非是java.util.ArrayList,而在这个内部类ArrayList中,实际上数据的存储还是数组形式,而且是指向原来的数组,所以无法使用修改集合的方法,并且修改该集合上的内容会影响到原来数组。
asList方法:
内部类ArrayList:
示例:
Integer[] nums = {1,2,3,4};
System.out.println(Arrays.toString(nums));
List<Integer> list = Arrays.asList(nums);
list.set(0,2);
System.out.println(Arrays.toString(nums));
结果:
remove/add:
在foreach循环里进行元素的remove/add操作会导致ConcurrentModificationException异常。remove元素需要使用Iterator方式。
原因: 由于每次对集合的remove/add操作会导致modCount加一,而expectedModCount和modCount不相同会导致ConcurrentModificationException异常。
解决方法: 使用迭代器来代替foreach。
代码:
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
if ("1".equals(string))
iterator.remove();
}
`