基于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


猜你喜欢
- 前言ParametersInterceptor * 其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈
- 创建started service 应用组件(例如Activity)
- 动态规划算法动态规划算法的思想动态规划算法处理的对象是多阶段复杂决策问题,动态规划算法和分治算法类似,其基本思想也是将待求解问题分解成若干个
- 本文实例为大家分享了java实现加减乘除计算器的具体代码,供大家参考,具体内容如下代码import java.awt.*;import ja
- 定义里氏替换原则(Liskov Substitution Principle,LSP),官方定义如下: 如果对每一个类型为S的对象o1,都有
- 本文主要解决以下几个问题:我们都知道Android的刷新频率是60帧/秒,这是不是意味着每隔16ms就会调用一次onDraw方法?如果界面不
- 目录如何快速获取 相册分类一些异常情况的处理Recycleview-CursorAdapter还有必要用LoaderManager吗总结如何
- 之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘;Java实现两人五子棋游戏(三) 画出棋子;Java实现两人五子棋游戏(四) 落
- 前言在实现红黑树之前,我们先来了解一下符号表。符号表的描述借鉴了Algorithms第四版,详情在:https://algs4.cs.pri
- 一、安装jdk1.查看Linux自带的JDK是否已安装java –version如果出现openjdk,最好还是先卸载掉openjdk,在安
- activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,比如一个简单的采购流程:流程如下: 供应商上新商品
- 本文实例讲述了C#对二进制数据进行base64编码的方法。分享给大家供大家参考。具体实现方法如下:using System;using Sy
- springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下:第一步,配置 web.xml <session
- 一.以springboot为例,建立代码1.IExecCommandServer:public interface IExecCommand
- 前言:现在的手机品牌和型号越来越多,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同,比如我们的设计稿一个View的大小是300
- 简介optional类是java8中引入的针对NPE问题的一种优美处理方式,源码作者也希望以此替代null。历史1965年,英国一位名为To
- 本文实例为大家分享了Android实现滚动日期选择器的具体代码,供大家参考,具体内容如下wheelview滚动效果的View这段时间需要用到
- 集合>队列Queue>创建队列System.Collections.Queue类提供了四种重载构造函数。using System
- 调整数组顺序使奇数位于偶数之前1. 题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的
- 获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map