首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JDK源码解析之java.util.ListIterator

,则返回true boolean hasPrevious(); // 返回列表集合中前一个元素 E previous(); // 返回对next的后续调用所返回的元素的索引...// 从列表中移除由next或previous返回的最后一个元素 void remove(); // 用指定元素替换next或者previous返回的最后一个元素 void...set(E e); //将指定的元素插入列表 void add(E e); } 由以上源码内容可以看出可以ListIterator的特点: (1)双向移动(向前/向后遍历). (2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.... (3)可以使用set()方法替换它访问过的最后一个元素. (4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素....ListIterator有add方法,可以向List中添加对象,而Iterator不能。

22410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    jdk源码分析之List--常用实现类分析与对比

    ,返回入参o在列表中最后一个匹配的位置(如果没找到,返回-1) ListIterator listIterator(),返回一个迭代器 ListIterator listIterator(int...首先检查index位置是否合法,然后返回一个列表迭代器ListItr,其实现了ListIterator接口并继承了Itr类,其实也就是提供了列表中任何一个位置元素向前和向后遍历的方式 public...如果满足o==this也就是同一个列表,返回true;如果入参不是List接口实例(类型不匹配),返回false;然后获取两个列表的迭代器,并且遍历元素,如果找到相应位置上不相等的元素,直接返回false...因为从linkLast方法中我们直接找到last节点然后修改next指针指向我们新元素,把新元素的prev节点指向last节点,最后把last指针指向新节点就好了,中间不牵扯类似ArrayList中的扩容和数组复制问题...),那么会从最后一个元素遍历,凑巧一下子找到了元素,这种情况下性能是和ArrayList中的get性能一样的;然后index为500000得时候,ArrayList和之前get性能基本一样,而LinkedList

    25220

    16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)

    遍历Collection中元素:不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,类似于Java的数组。和上面的Set不同,List允许有相同的元素。   ...除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator...通过get(int index)获取ArrayList第index个元素时。直接返回数组中index位置的元素,而不需要像LinkedList一样进行查找。...它们都继承于AbstractList,而AbstractList中分别实现了 “iterator()接口返回Iterator迭代器” 和 “listIterator()返回ListIterator迭代器

    92300

    源码阅读之ArrayList

    elementData数组,匹配第一个和o相等的元素,如果存在返回对应元素的下标序号,否则返回-1。...,数组中的元素按照ArrayList中的第一个到最后一个顺序排列,修改返回的数组不会影响原ArrayList中的数据。...,删除匹配的第一个元素 //原理:将匹配的第一个元素的位置下标加1开始到末尾的元素向前移动一位,最后一位赋值为null,GC进行回收 public boolean remove(Object...int lastRet = -1; // 最后一个元素的下标,如果不存在则返回-1 int expectedModCount = modCount; public...从中可以看出,当容量不够时,都要将原来的元素拷贝到一个新的数组中,耗时而且还需要重新分配内存,因此建议在事先能确定元素数量的情况下,明确指明容量大小。

    67240

    Java基础系列7——集合系列(1)框架概述

    ListIterator是专门为遍历List而存在的。 Collection详解 Collection是一个接口,它主要的两个分支是:List 和 Set。...List是有序的队列,List中可以有重复的元素;而Set是数学概念中的集合,Set中没有重复元素! List和Set都有它们各自的实现类。...,则返回-1 abstract int lastIndexOf(Object object) //返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回...返回迭代中的下一个元素 abstract void remove() //从底层集合中删除此迭代器返回的最后一个元素 8、ListIterator ListIterator的定义如下: public...专门用于便利List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等等API接口。

    45530

    JDK源码分析-List, Iterator, ListIterator

    void add(int index, E element); // 移除指定位置的元素 E remove(int index); // 某个元素在集合中(第一次出现)的位置 int indexOf...(Object o); // 某个元素在集合中最后一次出现的位置 int lastIndexOf(Object o); // 返回元素的列表迭代器 // 相当于 list.listIterator(...其方法概述如下: // 是否有更多元素 boolean hasNext(); // 返回迭代的下一个元素 E next(); // 从底层集合中删除此迭代器返回的最后一个元素(可选操作) // 每次调用.../ 如果列表迭代器位于列表的开头,则返回 -1 int previousIndex(); // 用指定的元素替换 next() 或 previous() 返回的最后一个元素 void set(E e)...都有 next() 和 hasNext() 方法,都可以实现向后遍历;而 ListIterator 有 previous() 和 hasPrevious() 方法,可以向前遍历。 4.

    34020

    Java 集合基础入门,看这篇就够了

    注意:ListIterator 如果要进行由后向前迭代,必须先进行由前向后迭代。...范例 结果展示: 使用 ListIterator 接口实现了 ListIterator 集合的双向迭代输出,首先利用 hasNext() 与 next() 实现由前向后的数据迭代,然后使用 hasPrevious...而用 Map 集合保存数据时,所保存的 key 与 value 会自动包装为 Map.Entry 接口对象,也就是说如果利用 Iterator 进行迭代,那么每当使用 next() 方法读取数据时返回的都是一个...Stack 子类 栈是一种 动态对象数组,采用的是一种 先进先出 的数据结构形式,即在栈中最早保存的数据最后才会取出,而最后保存的数据可以最先取出。...在开发中 ArrayList 性能较高,属于异步处理;而Vector性能较低,属于同步处理。

    42620

    Java 集合深入理解:List 接口

    返回指定元素在 list 中的首次出现/最后一次出现的位置(获取 lastIndexOf 是通过倒序遍历查找); addAll(int,Collection) 在特定位置插入指定集合的所有元素...这些元素按照迭代器 Iterator 返回的先后顺序进行插入; 下面是一个简单的 List 中的元素交换方法: public static void swap(List a, int i,...List.subList 方法并没有像我们想的那样:创建一个新的 List,然后把旧 List 的指定范围子元素拷贝进新 List,根!本!不!是!...在 List 中有两个转换成 数组 的方法: Object[] toArray() 返回一个包含 List 中所有元素的数组; T[] toArray(T[] array) 作用同上,不同的是当...参数 array 的长度比 List 的元素大时,会使用参数 array 保存 List 中的元素;否则会创建一个新的 数组存放 List 中的所有元素; ArrayList 中的实现: public

    52850

    Java 集合深入理解(4):List 接口

    返回指定元素在 list 中的首次出现/最后一次出现的位置(获取 lastIndexOf 是通过倒序遍历查找); addAll(int,Collection) 在特定位置插入指定集合的所有元素。...这些元素按照迭代器 Iterator 返回的先后顺序进行插入; 下面是一个简单的 List 中的元素交换方法: public static void swap(List a, int i,...List.subList 方法并没有像我们想的那样:创建一个新的 List,然后把旧 List 的指定范围子元素拷贝进新 List,根!本!不!是!...在 List 中有两个转换成 数组 的方法: Object[] toArray() 返回一个包含 List 中所有元素的数组; T[] toArray(T[] array) 作用同上,不同的是当...参数 array 的长度比 List 的元素大时,会使用参数 array 保存 List 中的元素;否则会创建一个新的 数组存放 List 中的所有元素; ArrayList 中的实现: public

    1.2K100

    ArrayList 源码分析

    :至少需要的容量为两个集合的长度之和,同样是通过 ensureCapacityInternal() 来保证容量是足够的,然后调用 System.arraycopy 将要添加的集合中的元素复制到原集合已有元素的后面...removeAll,删除不在指定集合中的所有元素 retainAll 这两者都是通过 batchRemove 来批量删除 // 删除在指定集合中的所有元素 public boolean removeAll...remove(Object o),参数 o 可以为 null fastRemove(int index) 与 remove(int index) 几乎一样,只不过不返回被删除的元素 public boolean...:: ArrayList 的迭代器 Iterator 和 ListIterator 在《设计模式 | 迭代器模式及典型应用》这篇文章中有过详细介绍,这里只做一个小结 ListIterator 有 add...() 方法,可以向List中添加对象,而 Iterator 不能 ListIterator 和 Iterator 都有 hasNext() 和 next() 方法,可以实现顺序向后遍历,但是 ListIterator

    37610

    十个经典Java 集合面试题!

    这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。...6.Iterator和ListIterator的区别 ●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...●ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的'...●在HashMap中如果两个元素是相等的,则key1.equals(key2) ●在IdentityHashMap中如果两个元素是相等的,则key1 == key2 来自:evget.com/article

    54710

    面试官最喜欢问的十道java面试题

    这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。...6.Iterator和ListIterator的区别 ●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...●ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"...●在HashMap中如果两个元素是相等的,则key1.equals(key2) ●在IdentityHashMap中如果两个元素是相等的,则key1 == key2

    55380

    10 个经典的 Java 集合面试题,看你能否答得上来?

    这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。...6.Iterator和ListIterator的区别 ●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...●ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的'...●在HashMap中如果两个元素是相等的,则key1.equals(key2) ●在IdentityHashMap中如果两个元素是相等的,则key1 == key2

    38910

    Java ArrayList源码分析,带你拿下面试官(含扩容机制等重点问题分析)

    List 在 Collection中充当着一个什么样的身份呢?——有序的 collection(也称为序列) 实现这个接口的用户以对列表中每个元素的插入位置进行精确地控制。...用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。 1.2 ArrayList 是什么?...,这就意味着后面的所有元素全部需要移动一个位置,所以时间复杂度为 O(n) 平均的情况呢,由于在每一个位置插入的概率都是相同的,而插入越靠前移动的元素越多,所以平均情况就与中间那个值的一定次数相等,为...,但是通过运行结果也可以看出,方法一添加后,在本次遍历中不会输出添加的结果,而方法二却可以。...remove() 方法,add 方法在 ListIterator 中有 remove 之前必须先调用 next,remove 开始就对 lastRet 做了不能小于 0 的校验,而l astRet 初始化值为

    1.6K22

    中级java面试题_最新中级Java面试题及答案

    这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。...6.Iterator和ListIterator的区别 ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的”...在HashMap中如果两个元素是相等的,则key1.equals(key2) 在IdentityHashMap中如果两个元素是相等的,则key1==key2 发布者:全栈程序员栈长,转载请注明出处:https

    35210

    线性表及ArrayListLinkedList源码分析总结

    ②如果元素有多个,除了第一个和最后一个元素之外,每个元素只有一个前驱元素和一个后驱元素。   ③第一元素没有前驱元素,最后一个元素没有后继元素。   ④序列中的元素数据类型相同。...首先我们得从最后一个元素开始遍历,到第i个位置,分辨将他们向后/前移动一个位置;在i位置处将要插入/删除的元素进行相应的插入/删除操作;整体的表长加/减1.   ②如果我们在线性表的第一个位置插入/删除一个元素...super T> action就是我们对集合中的元素所施加的操作。...Iterator类中的结果方法——hasNext(),用于判断在遍历时collection集合中是否还有剩下的元素;next()用于返回遍历时集合中的下一个元素,这两个方法很好理解。...中的最后一个元素作为插入后链表的最后一个元素就可以了 } else { //否则的话说明是在原链表中间插入元素 pred.next = succ;

    66340

    10个经典的Java面试题集合

    快速失败的Java迭代器可能会引发ConcurrentModifcationException在底层集合迭代过程中被修改。故障安全作为发生 在实例中的一个副本迭代是不会抛出任何异常的。...这个容量可随着不断添加新元素而自动增加,但是增长算法并没 有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。...6.Iterator和ListIterator的区别 ListIterator有add()方法,可以向List中添加对象,而Iterator不能。...CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之 间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的...在HashMap中如果两个元素是相等的,则key1.equals(key2) 在IdentityHashMap中如果两个元素是相等的,则key1 == key2

    1K50

    Java 集合源码解析(2):ListIterator

    ListIterator 根据官方文档介绍, ListIterator 有以下功能: 允许我们向前、向后两个方向遍历 List; 在遍历时修改 List 的元素; 遍历时获取迭代器当前游标所在位置。...注意,迭代器 没有当前所在元素一说,它只有一个游标( cursor )的概念,这个游标总是在元素之间,比如这样: 初始时它在第 0 个元素之前,调用 next() 游标后移一位: 调用 previous...当向后遍历完元素,游标就会在元素 N 的后面: 也就是说长度为 N 的集合会有 N+1 个游标的位置。...add(E) 在游标 前面 插入一个元素 注意,是前面 void set(E) 更新迭代器最后一次操作的元素为 E,也就是更新最后一次调用 next() 或者 previous() 返回的元素...expectedModCount = modCount; } //当游标没有跑到最后一个元素后面时 hasNext 返回 true public boolean hasNext

    83790
    领券