容器2

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()。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容