标签:arrays ESS action main 不可 code 分类 泛型 迭代
创建集合时不跟泛型
编译器检查不出元素的类型,取元素时需要强转,若强转类型不对则报异常
使用Arrays.asList()生成的List
进行add()或delet()操作运行时会出异常,因为Arrays.asList()的底层为数组,长度不可改变
分类
Collection
List
ArrayList LinkedList
queue
map
ArrayList
add(int index, E element) 将指定的元素插入此列表中的指定位置。
默认使用System.arraycopy方法进行挪移元素
线程不安全:
List list = Collections.synchronizedList(new ArrayList(...));//进行同步
容量大小和元素个数的关系??
default关键字(虚拟扩展方法),List接口实现了sort()方法,可以在接口里对方法实现
Iterator
ArrayList迭代器如下
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
不允许在foreach里删除或添加操作(来自<<阿里巴巴Java开发手册>>)
List<String> a = new ArrayList<>();
a.add("1");
a.add("2");
for (String string : a) {
if("2".equals(string)) {
a.remove(string);
}
System.out.printlb(String);
}
异常: java.util.ConcurrentModificationException
分析:
remove("1")
第一轮: cussor=0,size=2,取出"1"后cussor+1,删除"1"后size=1
第二轮: cussor=1,size=1, 经hasNext()判断结束循环,元素"2"没有得到遍历
remove("2")
第一轮: cussor=0,size=2,取出"1"后cussor+1,size不变
第二轮: cussor=1,size=2, 取出"2"后cussor+1,删除"2"后size=1
第三轮: cussor=2,size=1,hasNext()为true不能结束循环,此时进入next()方法内的checkForComodification()方法就抛出异常
标签:arrays ESS action main 不可 code 分类 泛型 迭代
原文地址:https://www.cnblogs.com/mdc1771344/p/9928480.html