list用于描述一个有序集合,集合中每个元素的位置十分重要;
链表linkedlist
在有序的集合中间位置插入元素才有意义。
通过迭代器插入元素:调用容器对象方法得到迭代器对象,next()跳过当前元素,调用add()在跳过的元素之后插入新元素。可以多次add()。得到迭代器就add(),新加元素将成为第一个元素,hasNext()返回false是,add()添加元素成为最后一个元素。多次add()插入次序待验证。
n个元素插入位置有n+1个,add()依赖与迭代器的位置,remove()依赖与迭代器的状态。set()取代next()返回的元素。
previous(),hasPrevious()倒叙遍历集合。
并发增删集合,可能导致并发modify异常。并调用set()不报异常。
数组列表ArrayList,Vector
list中访问元素协议:迭代器与get/set随机访问,后者不适用于链表,对数组很有效。
数组列表维护了一个动态数组,vector对象的所有方法都是同步的,支持多线程安全访问,ArrayList不是同步的。
散列表
散列表由链表数组实现。
如HashSet
如果不在意元素出现的顺序,又可以快速查找元素,就用散列表。散列表为每个元素计算一个散列码,散列码是用对象实例域产生的一个整数。
hashCode()必须与equals()方法兼容,及a.equals(b)则a,b的哈希码一致。
每个列表称为桶,要查找元素位置,需先计算哈希码在于桶的总数取余,得到保存元素的桶的索引。
树集TreeSet
实现基于TreeMap,类似于散列集但是有序:以任意顺序插入,遍历输出时按排列顺序输出,排序基于红黑树实现。
新增速度:数组链表<树集<散列表
对象的比较comparable,重写comparable接口时注意防止溢出。
队列与双端队列
尾部添加元素首部删除元素;双端队列首部尾部都可删除添加元素。
优先级队列
按任意顺序插入,按排序顺序检索,未对所有元素排序。remove()总会得到最小的元素。采用数据结构堆heap,一种自我调整的二叉树,增删元素总会把最小元素移到根上。
使用场景:任务调度,启动一个新任务前,调用remove()得到最小元素及优先级最高的元素,定义数字越小优先级越高,1优先级最高。
映射表
通用实现hashmap,treemap。
keySet(),values(),entrySet()。