android list 替换元素_JDK源码分析-List, Iterator, ListIterator

news/2024/7/4 9:46:55

c7217a694a3073ed68fb95037ee37ad3.png

List 是最常用的容器之一。之前提到过,分析源码时,优先分析接口的源码,因此这里先从 List 接口分析。List 方法列表如下:

72af493ab85e59816f2db776d679b81c.png

由于上文「JDK源码分析-Collection」已对 Collection 接口的方法进行了简要分析,而 List 接口继承自 Collection,因此这里只分析一些 List 特有的方法:

// 将一个集合的所有元素添加到当前集合的指定位置;
boolean addAll(int index, Collection<? extends E> c);

// 用指定的运算结果替代集合中的所有元素
default void replaceAll(UnaryOperator<E> operator);

// 用指定的 Comporator 对集合元素进行排序
default void sort(Comparator<? super E> c);

// 获取指定位置的元素
E get(int index);

// 将某个位置的元素替换为指定元素
E set(int index, E element);

// 将指定元素添加到集合的指定位置
void add(int index, E element);

// 移除指定位置的元素
E remove(int index);

// 某个元素在集合中(第一次出现)的位置
int indexOf(Object o);

// 某个元素在集合中最后一次出现的位置
int lastIndexOf(Object o);

// 返回元素的列表迭代器
// 相当于 list.listIterator(0)
ListIterator<E> listIterator();

// 返回元素的 listIterator(指定起始位置)
ListIterator<E> listIterator(int index);

// 获取集合的子集
List<E> subList(int fromIndex, int toIndex);

由于这里涉及到了 ListIterator 接口,而它又继承自 Iterator 接口,因此对这两个接口也进行简要分析,同时也算为后续分析 ArrayList 等实现类做些准备工作。这两个接口的继承结构如下:

05555123db25488716899696b1928f68.png

Iterator 接口是用于遍历集合元素的迭代器,它替代了 JCF 中的 Enumeration 接口。其方法概述如下:

// 是否有更多元素
boolean hasNext();

// 返回迭代的下一个元素
E next();

// 从底层集合中删除此迭代器返回的最后一个元素(可选操作)
// 每次调用 next() 时只能调用一次此该方法
default void remove();

// 对剩余的每个元素执行给定的操作
default void forEachRemaining(Consumer<? super E> action);

ListIterator,列表的迭代器,继承自 Iterator,可以从列表的两端进行遍历(Iterator 只能从前到后)。它在 Iterator 基础上增加方法如下:

// 是否有前一个元素(可理解为从后往前遍历)
boolean hasPrevious();

// 获取前一个元素
E previous();

// 返回对 next() 的后续调用将返回的元素的索引
// 如果列表迭代器位于列表的末尾,则返回列表大小
int nextIndex();

// 返回对 previous() 的后续调用将返回的元素的索引
// 如果列表迭代器位于列表的开头,则返回 -1
int previousIndex();

// 用指定的元素替换 next() 或 previous() 返回的最后一个元素
void set(E e);

// 插入指定元素到列表中
void add(E e);

注意,迭代器的游标在元素之间,如下:

/*
 *                      Element(0)   Element(1)   Element(2)   ... Element(n-1)
 * cursor positions:  ^            ^            ^            ^                  ^
 */

二者的区别与联系:

  1. ListIterator 继承自 Iterator.
  2. 都有 remove() 方法,都可以删除对象。
  3. 都有 next() 和 hasNext() 方法,都可以实现向后遍历;而 ListIterator 有 previous() 和 hasPrevious() 方法,可以向前遍历。
  4. ListIterator 有 add() 和 set() 方法,可以向 List 添加和修改元素;而 Iterator 不能。
小结:List 作为集合(Collection),其最主要的特点就是「有序」,可以把它理解为一个数组,因此才能进行许多与位置(下标)相关的操作。

31223e253f9df18110ade52c4b8fef90.png

http://www.niftyadmin.cn/n/4058289.html

相关文章

改变JVM中的参数以提高Eclipse的运行速度

首先建立评估体系&#xff0c;将workspace里所有的项目close掉&#xff0c;关闭eclipse。优化的用例就是启动eclipse&#xff0c;open一个项目&#xff0c;eclipse会自动build这个项目&#xff0c;保证没有感觉到明显的卡&#xff0c;也就是没有full GC。 开始&#xff1a; …

运算符重载:string类

运算符重载规则如下&#xff1a; ①、 C中的运算符除了少数几个之外&#xff0c;全部可以重载&#xff0c;而且只能重载C中已有的运算符。 ②、 重载之后运算符的优先级和结合性都不会改变。 ③、 运算符重载是针对新类型数据的实际需要&#xff0c;对原有运算符进行适当的改造…

10个方法提高你的编程生产力 转载

我在google工作过&#xff0c;现在有了自己的公司&#xff0c;多年的程序员工作经验告诉我&#xff0c;如果有一个良好的工作习惯&#xff0c;能够极大提高你的工作效率。以下是我的建议&#xff0c;如果你长时间坚持这样做&#xff0c;一年到两年时间&#xff0c;你发现你能够…

css sprites-简单实例让你快速掌握css sprites精髓

这段时间有几次接触到了css sprites的概念&#xff0c;一个就是在用css做滑动门的时候&#xff0c;另外一个就是在用YSlow分析网站性能的时候&#xff0c;于是对css sprites这个概念产生了浓厚的兴趣。在网上查找了很多的资料&#xff0c;但可惜的是大部分都是只言片语&#xf…

SCAU 概率论 期末复习(开卷)

说明&#xff1a;由于考试是上机开卷&#xff0c;所以下面写出了求值的代码&#xff08;java&#xff09;&#xff0c;考试的时候可以直接输入数据即可获得答案。 第四章 1.求下四分位&#xff0c;中位数和上四分位 package com.company;import java.util.Arrays; import ja…

远程访问大华摄像头_通过WEB调用大华网络摄像头

通过WEB调用大华网络摄像头1.要调用的大华摄像头为Dahua 大华DH-IPC-HFW2100P-0600B 网络摄像机 (白色)&#xff0c;摄像头外形如下图所示2.调用效果如下图所示4.解压OCX包单击文件中的reg.bat注册dll5.新建index.html关输入以下代码视频控件body {font-family:"", a…

面试题14:剪绳子(动态规划,贪心算法)

一、题目&#xff1a; 一根长度为n的绳子&#xff0c;剪成m段,m,n都大于1&#xff0c;且都为整数,每段长度记为k[0],k[1]…,k[m].求k[0]*k[1]…*k[m]可能的最大乘积 1.1解法&#xff1a; 两种不同的方法解决这个问题&#xff0c;先用常规的需要O(n)时间和O(n)空间的动态规划…

python re模块导入_Python正则re模块使用步骤及原理解析

python中使用正则表达式的步骤&#xff1a;1.导入re模块&#xff1a;import re2.初始化一个Regex对象&#xff1a;re.compile()3.刚刚创建的Regex对象调用search方法进行匹配&#xff0c;返回要给March对象4.刚刚的March对象调用group方法&#xff0c;展示匹配到的字符串下面例…