基于java构造方法Vector遍历元素源码分析
作者:叫我王员外就行 发布时间:2023-11-25 05:21:40
(注意:本文基于JDK1.8)
前言
任何一个容器类对象用于持有元素后,总是需要遍历元素的,即挨个去访问每个元素1次,而遍历元素,除了常规的依赖于数组对象的下标之外,更常用的是封装好的迭代器,今天就来学习Vector中的迭代器是如何设计的,与迭代器相关的方法有:
iterator()
listIterator()
listIterator(int index)
3个Vector中的定义的方法,均会返回一个迭代器对象……简单说说这3个方法的来历
iterator()方法的来历
iterator()方法,是Vector实现的Iterable接口规范的方法,如何你直观的去看Vector的类结构,你并找不到Iterable接口的定义,你看到的应该是这样的:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
…………省略代码…………
}
那么Iterable接口在哪里呢?没错,就在List接口中,List接口继承了Collection接口,而Collection接口则又继承了Iterable接口,因为Vector实现了List接口,所以间接获得iterator()方法的实现需求。
List接口表示具备线性表的能力、Collection接口表示具备集合的能力,而Iterable接口则表示具备可遍历的能力
List扩展了Collection的能力,而Collection又扩展了Iterable的能力,List的能力最大,且也符合这样的规范,既然作为线性表,当然应该具备Collection中的定义的能力,而既然作为集合,应该具备可遍历元素的能力。
listIterator()与listIterator(int)方法的来历
这两个方法,则来源于Vector的父类AbstractList中的定义,只不过Vector均对其进行了重写,而AbstractList则是根据自己实现的List接口,而实现的这两个方法。话不多少,接下来看看
iterator()方法分析
public synchronized Iterator<E> iterator() {
return new Itr();
}
用于返回一个迭代器对象的方法,synchronized修饰,只有获取到对象的锁的线程才能执行该方法
1、创建Itr对象
Itr是定义在Vector中的普通内部类,它产生的对象用于表示迭代器,也称为迭代器对象
2、向调用者返回迭代器对象
listIterator()方法分析
public synchronized ListIterator<E> listIterator() {
return new ListItr(0);
}
用于返回一个迭代器对象的方法,此迭代器用于从第一个元素开始遍历
1、创建ListItr对象
ListItr也为Vecor中的定义的一个普通内部类,它的构造方法可以传入的一个参数,表示起始下标(从哪个元素开始)
2、向调用者返回ListItr对象
listIterator(int)方法分析
public synchronized ListIterator<E> listIterator(int index) {
if (index < 0 || index > elementCount)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
用于返回一个迭代器对象,传入的参数表示此迭代器可以从哪个元素开始
1、检查传入的下标是否合理
当传入下标小于0、或者传入的下标大于elementCount(即表示元素总数、又表示即将添加新元素的下标),则证明不合理,此处会抛出IndexOutOfBoundsException()对象
2、创建ListItr对象
利用传入的下标,将其传入到ListItr的构造方法中,创建一个指定从某个下标处开始的迭代器对象
3、返回迭代器对象ListItr
总结
迭代器操作,全部依赖Itr类、以及ListItr类产生的对象,真真的迭代器对象就是它们,所以下一篇将直接分析,Itr类与ListItr类的所有方法
来源:https://blog.csdn.net/cadi2011/article/details/116809430
猜你喜欢
- Spring的出现是为了简化 Java 程序开发,而 SpringBoot 的出现是为了简化 Spring 程序开发.SpringBoot
- 在javaweb中写了一个图片的链接,可以打开预览,另外提供一个下载功能。以下是预览代码,没什么好说的;href若连接的是一个压缩包文件之类
- 本文实例为大家分享了Java实现坦克大战小游戏的具体代码,供大家参考,具体内容如下创作背景:n年前的学期末课题设计,从b站上学的,一个代码一
- Java8对于LocalDateTime的序列化和反序列化这里以jackjson为例配置反序列化工具/** * 时间戳反序列化时间 * *
- 1、原理事务的概念想必大家都很清楚,其ACID特性在开发过程中占有重要的地位。同时在并发过程中会出现一些一致性问题,为了解决一致性问题,也出
- 一、简介ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的
- 如何实现封装可以分为两步:第一步:将类的变量声明为private。第二步:提供公共set和get方法来修改和获取变量的值。代码展示publi
- Android中获取资源 id 及资源 id 的动态获取我们平时获取资源是通过 findViewById 方法进行的,比如我们常
- 一、项目要求实现一个通讯录通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定
- 匿名类类型类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有
- Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用。类型擦除是泛型中最让人困惑的部
- 一、Kotlin 调用 Java1. kotlin 关键字转义java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关
- java中Hashmap的get方法map中存储的是键值对,也就是说通过set方法进行参数和值的存储,之后通过get“键”的形式进行值的读取
- 一、线程的优先级别线程优先级别的使用范例:package cn.galc.test;public class TestThread6 { p
- 很多童鞋反应在吧项目导入到eclipse(myeclipse)时中文会有乱码,修改了编码格式后还是乱码,这里给大家介绍一下关于中文乱码时修改
- 数据库里面表的字段中带有“”_“下划线,我们知道插件默认的是将这些带有下划线的字段默认的变成“优美的驼峰式”的。表是肯定不能动的,实体类的字
- 正在尝试分配更低的访问权限?在进行Java编程时会给我们报出如下提示怎么办?这里我们将给大家介绍详细的解决方法。首先,查看,控制台给出的提示
- Feign的作用是将Http请求抽象化为一个Interface客户端,可以调用接口的形式来执行Http请求,以达到简化Http调用的目的。F
- 通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了。
- 一、代码先上代码(以下这段代码会有多种执行结果)@Testpublic void test_interrupted_thread() thr