初识java集合——迭代器

* Collection接口中有2个基本的方法
* add和iterator
*
* add(E e)是用于向集合中添加元素,如果添加元素成功,则返回true, 反之为false(例如向集里面添加,因为集是不允许重复的)
*
* Iterable接口只包含了一个方法
* Iterator<E> iterator();
* 编译器将foreach循环翻译为带有迭代器的循环
* foreach可以与任何实现了Iterable接口的对象一起工作
* Collection接口扩展了Iterable接口,因此标准库中的任何集合都可以使用foreach循环
*
* Iterator接口包含了三个方法
* next,hasNext,remove
* 注意,迭代器的位置并不是索引的位置,而是元素之间的空隙,用"|" 表示迭代器的话, |ABC A|BC AB|C ABC| (3次next)
* 我们通过反复调用next来达到遍历的目的,当到达了末尾继续的话,会抛出NoSuchElementException异常
* hasNext用于返回是否还有下一个元素
* 查找和迭代器位置变更时紧密相连的,查找元素的唯一方法是先调用next方法,迭代器越过了这个元素就能够获取这个元素了
* remove也是一样的,删除元素也必须要先越过这个元素才可以
*
*
* 元素被访问的顺序取决于集合类型:比如对于HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定能够遍历到
* 集合中的所有元素,但无法预知随机的次序出现。
*
* ListIterator-----------------------------------------------------------------------------------------------------------------
*
* 只有对于自然有序的集合使用迭代器添加元素才有实际意义,因此在Iterator接口中没有add方法,但在他子接口ListItrator中包含了add方法
* 与Collection.add方法不同,该方法是void的,此外,ListItrator还提供了2反向遍历的方法
* E previous();
* boolean hasPrevious();
* previous与next一样,都是要跨越才可以获取,而previous后调用remove删除的是此时右侧的元素
*
* 当用一个刚刚由Iterator方法返回,并且指向链表表头的迭代器用add,则会添加在表头;
* 当迭代器越过最后一个元素的时候(hasNext为false)时,添加的元素就是末尾;
*
* set方法用于用一个新的元素去替换 调用next或previous返回的元素
*
* ListIterator还有一个方法可以告知当前位置的索引
* nextIndex返回下一次调用next方法返回元素的整数索引
* previous返回的是下一次调用previous方法返回元素的整数索引
* 如果有一个整数索引n,x.listIterator将返回一个迭代器,这个迭代器指向索引为n
*
* !!当一个迭代器指向另一个迭代器刚刚删除的元素,现在这个迭代器就是无效的,并且不应该再被使用
* ListIterator的设计使它能够检测到这种修改:如果迭代器发现她的集合被另一个迭代器修改或或者被该集合自身方法修改了
* 就会抛出ConcurrentModificationException
*
* 每个迭代器都维护一个独立的计数值,在每个迭代器方法的开始出,检查自己改写操作的计数值是否与集合的改写操作数一致,不一致
* 则抛出ConcurrentModificationException错误;
*
* 因此我们需要遵循这么一个简单的规则
* 可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读列表,此外单独设置一个迭代器既可以写又可以读
*

时间: 2024-08-21 16:02:45

初识java集合——迭代器的相关文章

初识Java集合框架(Iterator、Collection、Map)

1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List和Set是Collection的子接口,ArrayList和LinkedList是List的两个实现类,HashSet和TreeSet是Set的两个实现类 重点:ArrayList.LinkedList和HashSet Map接口对应的集合是以K-V键值对的方式存储数据的,不同于Collection

初识java集合——映射表(Map)

*映射表 * java类库为映射表提供了两个通用的实现 HashMap和TreeMap * HashMap对键进行散列,TreeMap用键的整体顺序对元素进行排序,构建成搜索树 * * 与Set相似,HashMap的速度要比TreeMap要快一点,同时不需要按照排列访问,也应该选择HashMap * 注意,键的值必须是唯一的,如果第二次put了一个同样的键值进去,第二次的值会取代第一次的值,put会 * 返回用这个键参数存储的上一个值 * * 我们可以获取Map的视图,这是一组实现了Collec

初识java集合——链表

* 链表中的每个节点,存放着上一个节点的引用和下一个节点的引用 * 相对于泛型集合,链表是一个有序集合,每个对象的位置十分的重要 * 链表的add默认也是添加到尾部的 * * 链表的添加删除操作往往借助迭代器来完成,参见IteratorIntro * * 对于链表的遍历,绝对不要使用(代码区-1)的方式,例如get(3),要从头开 * 始到3的索引,get(7),又得从头开始到7的位置,效率非常的低. * 因为LinkedList对象不做任何缓存位置信息操作 * //代码区-1 for( int

初识java集合——树集

*TreeSet与HashSet相比,树集是有序集合,对树集遍历,每个值将自动按照排序顺序呈现. * TreeSet当前使用的是红黑树,每次将一个元素添加到树中时,都将被放置正确的位置之中 * * 在TreeSet中添加元素的速度要快于数组和链表,但慢于散列表(HashSet) * * TreeSet在默认情况下,假定插入的元素实现了Comparable接口,该接口值返回负数,表明a位于b之前 * * public interface Comparable<T> * { * int compa

初识java集合——散列表(HashTable)

[散列表]为每个对象计算一个整数,称为散列码(是由对象的实例域产生的一个整数)更确切的说 * 不同实例域的对象产生不同的散列码 * * 如果自定义类,就要负责实现这个类的hashcode,注意:自己实现的hashcode方法应该与equals方法兼容 * 即如果a.equals(b) 为true a和b必须具有相同的散列码 * * 在java中,[散列表]用链表数组实现.每个列表被称为桶.想要查找表中对象,先计算散列码,然后与桶的总数取余 * 所的余数就是桶的索引.当桶中没有其他元素时,很幸运可

初识java集合——其他集合

* 弱散列映射表(WeakHashMap) * 如果有一个值,对应的键已经不再使用了,将会出现什么情况呢 * 假定对某个键的而最后一次引用已经消亡,不再有任何途径引用这个值对象了,但是由于程序中任何 * 部分没有再引用这个键,所以这个键/值无法从Map中删除. * 遗憾的是,垃圾回收器跟踪活动的对象,只要Map对象时活动的,其中的所有桶也都是活动的,它们不能被回收. * 当对键的唯一引用来自散列表条目时,这一数据结构将于垃圾回收器协同工作一起删除键/值对 * * 下面是对于[弱散列映射表]的机制

初识java集合——队列

有两个端头的队列,称为双端队列.可以让人们有效的在头部和尾部同时添加或删除元素 * 不支持在队列中间添加元素 * *[ 优先级队列] * 可以按照任意的顺序插入,却总是按照排序的顺序进行检索,无论何时调用remove,返回的是 * 当前优先队列中最小的元素,然而优先级队列并没有对所有元素进行排序 * 如果用迭代器的方式,处理这些元素,并不需要对他们进行排序 * * 优先级队列使用了堆(heap)这个优雅高效的数据结构,对树执行添加和删除操作时,最小的元素总能 * 移动到根节点 * * 与Tree

【JAVA集合】集合迭代器快速失败行为及CopyOnWriteArrayList

以下内容基于jdk1.7.0_79源码: 什么是集合迭代器快速失败行为 以ArrayList为例,在多线程并发情况下,如果有一个线程在修改ArrayList集合的结构(插入.移除...),而另一个线程正在用迭代器遍历读取集合中的元素,此时将抛出ConcurrentModificationException异常导致迭代遍历失败: ArrayList.Itr迭代器快速失败源码及例子 查看ArrayList的Itr迭代器源码,可以看到Itr为ArrayList的私有内部类,有一个expectedMod

【9.0】对于java集合的迭代器的底层分析

前言:如果对java的集合的遍历(主要是HashMap中的keySet() 和 entrySet()是如何取值并且可以实现遍历的)不是很明白的话,有兴趣深入了解的小伙伴,本文可以作为一个参考,由于时间的原因,就着重讲其遍历的核心代码,底层迭代器的分析.如果对集合的遍历已经迭代器没有基本的理解的话,建议先看看相关的文章:不然很难看懂本文.推荐几篇相关博文: 1.实在没想到系列--HashMap实现底层细节之keySet,values,entrySet的一个底层实现细节 2.Java迭代器深入理解及