共同学习Java源代码--数据结构--AbstractList抽象类(五)

private class ListItr extends Itr implements ListIterator<E>

这又是一个内部类。继承自上一个内部类,实现了ListIterator接口,这个是专门迭代List的迭代器、

ListItr(int index) {

cursor = index;

}

首先是默认修饰符修饰的构造方法,将参数赋值给cursor变量。

public boolean hasPrevious() {

return cursor != 0;

}

这个方法判断是否可以向前迭代,判断的依据就是cursor是否为0.

public E previous() {

checkForComodification();

try {

int i = cursor - 1;

E previous = get(i);

lastRet = cursor = i;

return previous;

} catch (IndexOutOfBoundsException e) {

checkForComodification();

throw new NoSuchElementException();

}

}

这个方法返回上一个元素。首先判断两个modCount值是否相等。

然后创建变量i赋值为cursor减一,调用get方法获取上一个元素,将lastRet和cursor都赋值为i,最后返回上一个元素。如果此过程出现异常,先判断两个modCount是否同步,再抛出异常。

public int nextIndex() {

return cursor;

}

这个方法获取的是下一个元素下标,就是cursor的值。

public int previousIndex() {

return cursor-1;

}

这个方法获取的是上一个元素下标,就是cursor的值减1。

public void set(E e) {

if (lastRet < 0)

throw new IllegalStateException();

checkForComodification();

try {

AbstractList.this.set(lastRet, e);

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}

}

这个方法是赋值的方法首先判断lastRet元素是否小于0,否则就抛异常,小于0代表刚刚删除过元素,还没有进行迭代。然后再检查两个modCount是否相等。

然后调用set方法赋值,为lastRet下标的元素赋值,然后将两个modCount同步。

public void add(E e) {

checkForComodification();

try {

int i = cursor;

AbstractList.this.add(i, e);

lastRet = -1;

cursor = i + 1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}

}

这个方法是添加元素的方法。首先检查两个modCount变量是否相等。

然后创建变量i赋值为cursor。然后调用add方法添加元素,添加的下标是i,然后lastRet赋值为-1,cursor赋值为i+1,最后将两个modCount同步。

如果此过程出现异常则抛出异常。

时间: 2024-11-09 02:38:07

共同学习Java源代码--数据结构--AbstractList抽象类(五)的相关文章

共同学习Java源代码--数据结构--AbstractList抽象类(一)

这个抽象类实现了List接口,继承了AbstractCollection抽象类,是ArrayList的直接父类. public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 这是这个类的基本情况. protected AbstractList() { } 这是构造方法. public boolean add(E e) { add(size(), e); re

共同学习Java源代码--数据结构--AbstractList抽象类(四)

protected transient int modCount = 0; 这个属性是记录这个List被修改的次数.在以下几个内部类和非public类中使用. private class Itr implements Iterator<E> 首先先看这个内部类,实现了迭代器接口. int cursor = 0; 这个变量是游标. int lastRet = -1; 这个变量代表的是上一次迭代的元素的下标.如果删除一个元素的话,那么这个值就是-1. int expectedModCount =

共同学习Java源代码--数据结构--AbstractList抽象类(三)

public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof List)) return false; ListIterator<E> e1 = listIterator(); ListIterator<?> e2 = ((List<?>) o).listIterator(); while (e1.hasNext() && e2.hasNext()) {

共同学习Java源代码--数据结构--List接口

这个接口是各种List类的抽象接口,这个接口继承自Collection接口. public interface List<E> extends Collection<E> 这是接口的基本信息. int size(); 这个方法返回List的元素数. boolean isEmpty(); 这个方法判断List是否为空. boolean contains(Object o); 这个方法判断是否包含某个元素. Iterator<E> iterator(); 获取迭代器的方法.

【转】Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

[原文]https://www.toutiao.com/i6594587397101453827/ Java核心数据结构(List,Map,Set)使用技巧与优化 JDK提供了一组主要的数据结构实现,如List.Map.Set等常用数据结构.这些数据都继承自 java.util.Collection 接口,并位于 java.util 包内. 1.List接口 最重要的三种List接口实现:ArrayList.Vector.LinkedList.它们的类图如下: 可以看到,3种List均来自 Ab

慢慢人生路,学点Jakarta基础-深入剖析Java的接口和抽象类

在java面向对象编程的,抽象类和接口始终存在有疑问的地方,因为两者太多相似有太多不同,在刚开始学习的时候经常弄的不对,使用情景搞混,今天来总结之前学习Java中接口和抽象类的问题. 抽象类 了解:只声明,未具体实现. abstract void cry(); 抽象方法必须使用关键字abstract进行修饰,如果一旦一个类中包含了abstract方法,那么这个类必须使用abstract进行修饰:因为抽象类中含有未实现的方法,抽象类不能被实例化:抽象类不一定包含抽象方法,也就是说抽象类可以没有抽象

2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简述: (1)查找3是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素.对其进行查找的项目组有时也称为查找组. (2)查找方式的分类:线性查找,二分查找. (3)查找所要完成的目标:尽可能高效的完成查找,从算法分析的角度而言,我们希望最小化比较操作的次数,通常,查找池里项目数

经验之谈:循序渐进学习Java Web开发的五个阶段

Java web开发是Java开发中的主要方向,那什么是Java web开发呢,Java web开发就是基于J2SE的web应用程序开发,就是通过Java来解决互联网web应用的问题,互联网Web包含两个部分:web服务器和web客户端,Java语言在web服务器端的应用十分丰富,比如常用的Servlet.JSP等,总之,Java编程技术的到来给Web互联网的发展注入了一针强心剂,既然Java Web开发功能这么强大,那我们应如何循序渐进的学习Java Web开发呢?下面亦是美网络小编分为五个阶

20172311 2017-2018-2 《程序设计与数据结构》第五周学习总结

20172311 2017-2018-2 <程序设计与数据结构>第五周学习总结 教材学习内容总结 第五六章整体上来讲主要学习了条件判断与循环.小的知识点主要还有: 1.语句执行的顺序称为控制流,方法调用会引起控制流的改变. 2.相等性运算符由两个并列的等号组成,不要和只有一个等号的赋值运算符想混淆. 3.相等性运算符和关系运算符的优先级比算术运算符的优先级低. 4.在三种逻辑运算符中,逻辑非具有最高的优先级,其次是逻辑与,最后是逻辑或.逻辑运算符经常用于构成复杂的条件. 5.编写语句时适当的缩