-集合(9.1Java集合框架9.2具体的集合)
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-集合(9.1Java集合框架9.2具体的集合)相关的知识,希望对你有一定的参考价值。
9.1Java集合框架
一些有的没的
- 可以使用接口类型存放集合的引用。一旦改变了想法,只需要在调用构造函数的地方做一处修改。
- add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true。
- tostring()方法用来调试。
迭代器
- 不同于C++,查找操作与迭代器的位置变更是紧密相连的,在执行查找操作的同时,迭代器的位置随之向前移动。
- Iterator接口的remove方法将会删除上次调用next方法时返回的元素,仍然需要越过这个元素。
Queue、Deque extends Queue接口。(队列)
队列实现的两种方式的选择:
- 循环数组 ArrayDeque。优先选择,更高效。
- 链表 LinkedList。程序中要收集的对象数量没有上限时选择。
List接口
- List是一个有序集合
- 两种实现方式:数组、链表
- 测试一个集合是否支持高效的随机访问
if(c instanceof RandomAccess)
Set、SortedSet extends Set、NavigableSet extends SortedSet接口
- 基本等同于Collection接口,区别在于不允许重复。
- Set中的元素必须实现了equals和hashCode方法。
- SortedSet接口,提供用于排序的比较器对象,可以得到集合子集视图?
- NavigableSet接口,包含一些搜索和遍历有序集的方法。
9.2具体的集合
LinkedList类(链表)
- 从数组中间删除元素代价很大
- Java中,所有的链表底层都是双向链表
ListIterator接口
- 链表和泛型集合重要区别,链表是一个有序集合。区别Collection.add和ListIterator.add。后者不返回boolean类型值,假定操作总会改变链表。后者在迭代器位置前插入listiter.next();listiter.add("hello");,前者在链表尾部插入。
- ListIteraror接口有两个方法,previous和hasPrevious(),用来反向遍历链表。
- 可以给容器附加很多个迭代器,但只能有一个可写可读的迭代器。如果一个迭代器发现它的集合被另一个迭代器/集合自身方法 修改了,就会抛异常。
- 检测并法修改问题的方法:每个迭代器维护一个独立的计数值,若发现与集合改写操作计数值不一致,则抛异常。
- 程序需要随机访问时,通常不选择链表。同时,尽量避免引用索引访问链表。
ArrayList类(数组列表)
- ArrayList封装了一个动态再分配的数组对象。
- 需要动态数组时的选择
- Vector类的所有方法都是同步的,可以由两个线程安全的访问一个Vector对象。
- 不需要同步时使用ArrayList。
HashSet类(散列集)
- 放入其中的元素必须实现hashCode方法和equals方法。且两者兼容,即a.equals(b)==true则a与b必须具有相同的散列码。
- Java中,散列表用链表数组实现。每个列表称为桶。查找表中对象:计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。散列表只在某个桶中查找元素,而不必查看集合中的所有元素。
- ASL,指查找算法的查找成功时的平均查找长度,是为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值。
- 散列冲突:指不同对象散列到相同的hashcode。解决方法如下,
- 开发定址法:例如线性探测再散列,即产生冲突后 原查找对象+1 再做hash ,若产生冲突,原查找对象+2 再做hash,直到找到空的地方。
- 再哈希法:即产生冲突后用第二种hash函数。
- 链地址法:Java中HashSet采用这种方法。
- 建立一个公共溢出区:冲突的都放在公共溢出区。
- 桶满时,会发生散列冲突。Java 中,桶满时会从链表变为平衡二叉树。
- 设置桶数:如果大致知道要有多少个元素插入散列表,就可以设置桶数。通常设置为预计元素的75%-150%。标准类库使用的桶数是2的幂,默认值16。
- 装填因子决定何时对散列表进行再散列(创建一个桶数更多的表,将所有元素插入新表,丢弃原来的表):默认值0.75,超过75%的位置已经填入元素后,会用双倍的桶数进行再散列。
TreeSet类
- TreeSet是有序集合,对集合进行遍历时,每个值自动地安排序后的顺序呈现。底层使用红黑树实现。元素必须实现Comparable接口,或调构造函数时传入comparator对象。
- 性能:TreeSet添加元素比添加到HashSet慢,红黑树查找元素平均时间复杂度O(n)。
- TreeSet与HashSet的选择:如果需要排序,再使用TreeSet,因为有额外开销。
SortedSet extends Set ,接口
NavigableSet extands SortedSet, 接口
扩展了SortedSet,具有了搜索匹配元素的方法。
ArrayDeque implements Deque ,类;LinkedList implements Deque ,类
- 以上两个类实现了双端队列,并都可无限长度。ArrayDeque默认初始容量16。
- java.util.Queue 方法
- 入队 add/offer 抛异常/返回false
- 出队 remove/poll 抛异常/返回null
- 获得队首元素 element/peek 抛异常/返回null
- java.util.deque 方法
- addFrist/addLast
- 其他形式同上
PriorityQueue类
- 优先队列,底层实现堆。。堆是一个可以自我调整的二叉树,对堆执行add和remove操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。
- 优先级队列中元素必须实现Comparable接口,或构造器中提供实现了Comparator接口的对象。
- 使用优先级队列的典型示例是任务调度。
以上是关于-集合(9.1Java集合框架9.2具体的集合)的主要内容,如果未能解决你的问题,请参考以下文章