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

protected transient int modCount = 0;

这个属性是记录这个List被修改的次数。在以下几个内部类和非public类中使用。

private class Itr implements Iterator<E>

首先先看这个内部类,实现了迭代器接口。

int cursor = 0;

这个变量是游标。

int lastRet = -1;

这个变量代表的是上一次迭代的元素的下标。如果删除一个元素的话,那么这个值就是-1.

int expectedModCount = modCount;

这个变量的初始值为上面的modCount,如果这个值和外面那个modCount不一样,就会判定为发生并发异常。

public boolean hasNext() {

return cursor != size();

}

这个方法是判断是否还有下一个元素的方法,判断的依据就是游标变量是否等于List长度,如果等于就代表遍历完毕。

public E next() {

checkForComodification();

try {

int i = cursor;

E next = get(i);

lastRet = i;

cursor = i + 1;

return next;

} catch (IndexOutOfBoundsException e) {

checkForComodification();

throw new NoSuchElementException();

}

}

这个方法是迭代器向前迭代的方法。首先调用checkForComodification方法,就是判断modCount和expectedModCount是否相等的方法,如果不等就抛异常。

然后创建变量i,初始值为cursor值,cursor的初始值是0,也就是从0开始迭代。然后获取下一个元素next,调用的是List的get方法,再将lastRet变量的值赋值为i,cursor的值为i+1,最后返回next。如果此过程出现异常就再度调用checkForComodification方法,然后抛出无此元素异常。

public void remove() {

if (lastRet < 0)

throw new IllegalStateException();

checkForComodification();

try {

AbstractList.this.remove(lastRet);

if (lastRet < cursor)

cursor--;

lastRet = -1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException e) {

throw new ConcurrentModificationException();

}

}

这个方法是删除元素的方法。首先判断lastRef元素是否小于0,如果小于零说明之前已经删除元素了,并且没有继续迭代,所以会抛出异常。然后再检查两个modCount变量是否相等。

然后调用本List的删除方法,判断如果lastRet小于cursor的话,cursor就自减一,lastRef赋值为-1,因为向后遍历的话,lastRet这个值是刚才迭代的元素,迭代完cursor增加了1,如果删除刚才那个元素,cursor就要减回去。

最后两个modCount同步,一旦此过程出现异常,抛出异常。

final void checkForComodification() {

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

这个方法刚才说了。

时间: 2024-08-29 17:08:15

共同学习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抽象类(五)

private class ListItr extends Itr implements ListIterator<E> 这又是一个内部类.继承自上一个内部类,实现了ListIterator接口,这个是专门迭代List的迭代器. ListItr(int index) { cursor = index; } 首先是默认修饰符修饰的构造方法,将参数赋值给cursor变量. public boolean hasPrevious() { return cursor != 0; } 这个方法判断是否可以

共同学习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

[转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue

转载自http://janeky.iteye.com/blog/770671 --------------------------------------------------------------------------------- 7.BlockingQueue     “支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用.“ 这里我们主要讨论BlockingQueue的最典型实现:LinkedBlockingQueue 和Arra

java多线程学习-java.util.concurrent详解(四) Exchanger

转载于:http://janeky.iteye.com/blog/769965 我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “取消的异步计算.利用开始和取消计算的方法.查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现.仅在计算完成时才能获取结果:如果计算尚未完成,则阻塞 get 方法.一旦计算完成,就不能再重新开始或取消计算. 可使用 FutureTask 包装 Callable 或 Runnable 对象.因为 FutureTask 实现了

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

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

视图动画学习算法和数据结构(二)(&lt;Garry进阶(四)&gt;)

转载请注明: 接视图动画学习算法和数据结构(不定期更新)() 快速排序(QuickSort) 动画演示: java代码: public class QuickSort { private int array[]; private int length; public void sort(int[] inputArr) { if (inputArr == null || inputArr.length == 0) { return; } this.array = inputArr; length