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

E o1 = e1.next();

Object o2 = e2.next();

if (!(o1==null ? o2==null : o1.equals(o2)))

return false;

}

return !(e1.hasNext() || e2.hasNext());

}

这个方法是判断两个List是否相等的方法。

首先判断如果参数和本List引用的同一对象直接返回true。如果参数不属于List接口的实现类,直接返回false。

然后分别获取参数和本List的List迭代器,其中参数的List迭代器的泛型是?也就是虚的,本List的List迭代器的泛型是元素类型。

然后开始迭代两个List,获取各自的每个元素,依次判断是否为空以及是否相等,如果不等返回false。

一直没有返回false的话,就判断两个List是否还可迭代,如果有一个还可以迭代,就返回false,两个都不可再迭代了就返回true。||这个两侧必须都是false,整个表达式才会是false,左侧是true的话就会短路。。。

public int hashCode() {

int hashCode = 1;

for (E e : this)

hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

return hashCode;

}

这个方法是返回哈希值的方法。

首先定义初始哈希值为1,然后遍历这个List的所有元素,用31乘以初始哈希值再加上每个元素的哈希值,如果元素为空就加上0,把计算好的值赋给初始哈希值,然后一次次循环。。。

最后返回这个哈希值。

protected void removeRange(int fromIndex, int toIndex) {

ListIterator<E> it = listIterator(fromIndex);

for (int i=0, n=toIndex-fromIndex; i<n; i++) {

it.next();

it.remove();

}

}

这个方法是删除某区间内元素的方法。

首先获取List迭代器,起始迭代位置是第一个参数,然后进入for循环,循环要删除的区间所含元素数次,然后用迭代器删除这些元素。

private String outOfBoundsMsg(int index) {

return "Index: "+index+", Size: "+size();

}

这个方法是返回一个错误信息,在操作下标时,下标越界的提示信息。

时间: 2024-08-26 10:07:45

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

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

共同学习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详解(三)ScheduledThreadPoolExecutor

转载自http://janeky.iteye.com/blog/770441 ---------------------------------------------------------------------------------- 6. ScheduledThreadPoolExecutor     我们先来学习一下JDK1.5 API中关于这个类的详细介绍: "可另行安排在给定的延迟后运行命令,或者定期执行命令.需要多个辅助线程时,或者要求 ThreadPoolExecutor 具

java多线程学习-java.util.concurrent详解(三) Semaphore

转载于:http://janeky.iteye.com/blog/769965 我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者.但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动.” 我们一般用它来控制某个对象的线程访问对象 例如,对于某个容

跟我一起阅读Java源代码之HashMap(三)

上一节我们讲到了如何用散列和链表实现HashMap,其中有一个疑问今天已经有些答案了,为什么要用链表而不是数组 链表的作用有如下两点好处 1. remove操作时效率高,只维护指针的变化即可,无需进行移位操作 2. 重新散列时,原来散落在同一个槽中的元素可能会被散落在不同的地方,对于数组需要进行移位操作,而链表只需维护指针 今天研究下数组长度不够时的处理办法 table为散列数组 1. 首先定义一个不可修改的静态变量存储table的初始大小 DEFAULT_INITIAL_CAPACITY 2.

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

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