容器
更新日期:
1.总述

- Iterator:遍历并选择序列中的对象,只可以向后遍历的迭代器(ListIterator extends Iterator
可以前后遍历)
只有三个方法:
hasNext():判断有没有元素
next():取出下一个,到达集合末尾抛出异常
remove():将迭代器新近返回的元素在原列表中删除,所以在使用remove()方法前必须使用next(). - Collection:继承接口Iterator,存放一组对象的方式(AbstractCollection size()和iterator()是抽象方法,其他的都实例化)
size()
isEmpty()
contains()
containsAll()
retainAll(Collection<?> other)删除与other不同的元素,成功返回true
add()
addAll()
remove()
removeAll()
clear()
hashCode()
iterator()
toArray() - Map:一组成对的“键值对”对象,可根据键的值来查找对象
2.Iterator
(1).访问方式:
顺序的,比如:ArrayList,Iterator从0开始,next()一次,向后移动一个,
将其认为是在两个元素中间,next()一次,就越过一个元素,返回刚刚越过的元素的引用;
每次调用remove()之前要调用next(),否则会抛出异常,remove()一次,删除左边的元素。
若是ListIterator,previous()就向前移动一个,返回刚刚越过的元素,即右边的元素,删除时也是右边
非顺序的,set,元素会按照某种随机的次序出现,next()一次,就随机返回一个。
(2).fail-fast
1 | public E next() { |
迭代器在调用next()和remove()方法时都调用了checkForComodification(),检查在迭代进行时,容器有没有发生结构性的改变
checkForComodification()检测 modCount != expectedModCount ? 若不等则抛出ConcurrentModificationException 异常,从而产生fail-fast机制
AbtractList
protected transient int modCount = 0;
modCount: The number of times this list has been structurally modified.
Structural modifications are those that change the size of the list,
or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.
ArrayList
expectedModCount = modCount
如果迭代器在迭代时发现容器发生了结构性的变化,不包括set(),就会抛出fail-fast
3.List
(1).ArrayList:内部是通过数组实现的,一般用于对元素进行快速随机访问,时间复杂度为O(1),删除添加O(n)
数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,
要把已经有数组的数据复制到新的存储空间(大小为*1.5+1)中。
(2).LinkedList:内部是通过循环链表实现的,很适合数据的动态插入和删除,时间复杂度为O(1),访问为O(n)除了第一个元素和最后一个元素(O(1))
缺点是随机访问比较慢,要从头进行遍历
(3).同步:
- vector和arrayList一样,是使用数组实现,但是vector是线程安全的(sychronized)
vector扩容int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);capacityIncrement为扩容因子 - 同步包装器,List
users1 = Collections.synchronizedList(new ArrayList ())等 - java.util.concurrent.*,一般使用,但是CopyOnWriteArrayList效率没有同步包装器好
4.Set:不包括重复的元素, 其实Set的实现原理是基于Map上面的
(1).hashSet:存放顺序和添加进去时候的顺序没有任何关系,
就是建立一个“键值对”,“键”就是我们要存入的对象,“值”则是一个常量。这样可以确保, 我们所需要的存储的信息之是“键”
return map.put(e, PRESENT)==null;
(1).treeSet:对我们的Set中的元素进行排序存放
(2).LinkedHashSet:则保持元素的添加顺序
5.Queue:队列先进先出,类似排队,是双端队列
出错是要报错的
offer()添加,满了报错
peek()弹出,不删除,空了报错
poll()弹出,删除,空了报错
(1).PriorityQueue:使用小根堆实现,最小的在上面
5.Map:映射表,键必须唯一
(1).HashMap:对键进行hashCode(),以此来寻找和添加,
(2).TreeMap:排序,使用键的顺序对元素进行排序,比如搜索树
(3).WeakHashMap:使用弱引用保存键,如果某个对象那个只被key引用,垃圾收集器仍然回收