集合1
Posted mdc1771344
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合1相关的知识,希望对你有一定的参考价值。
集合
创建集合时不跟泛型
编译器检查不出元素的类型,取元素时需要强转,若强转类型不对则报异常
使用Arrays.asList()生成的List
进行add()或delet()操作运行时会出异常,因为Arrays.asList()的底层为数组,长度不可改变
分类
Collection
List
ArrayList LinkedList
- set
queue
map
List
ArrayList
add(int index, E element) 将指定的元素插入此列表中的指定位置。
默认使用System.arraycopy方法进行挪移元素
线程不安全:
List list = Collections.synchronizedList(new ArrayList(...));//进行同步容量大小和元素个数的关系??
default关键字(虚拟扩展方法),List接口实现了sort()方法,可以在接口里对方法实现
迭代器
Iterator
- boolean hasNext() 如果仍有元素可以迭代,则返回 true
- E next() 返回迭代的下一个元素
- void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)
- default void forEachRemaining(Consumer<? super E> action)
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()方法就抛出异常
以上是关于集合1的主要内容,如果未能解决你的问题,请参考以下文章
[ jquery 文档处理 insertBefore(content) before(content|fn) ] 此方法用于把所有匹配的元素插入到另一个指定的元素元素集合的前面,实现外部插入(代码片段