java集合系列06 AbstractList
来源:互联网 发布:网络运维需求调查表 编辑:程序博客网 时间:2024/06/05 16:53
万里长征第n步,终于到了AbstractList抽象类了,今天领导找我谈话了,问我为主要想在前端还是后端发展。当然是后端,而且是Java,就喜欢他的烦锁,就喜欢他的高难度,就喜欢他的一怒之下就编译报错,就喜欢他有源码可以研究,我真的真的是对动态类型的语言一点都不感冒,所以我展转反侧(学了php的基本语法,学了py的基本语法),终于找到了目的地(java)。
离我们研究ArrayList 和 LinkedList集合类又进了一步
我们先看一看文档对此抽象类的介绍吧
简介
此类提供List接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。对于连续的访问数据(如链表),应该优先使用AbstractSequentiaList,而不是此类。
要实现不可修改的列表,编程人员只需要扩展此类,并提供get(int)和size()方法的实现。
要实现可修改的列表,编程人员必须另外重写set(int, E)方法,如果列表为可变大小,则编程人员必须另外重写add(int ,E)和remove(int)方法。
按照 Collection 接口规范中的建议,编程人员通常应该提供一个 void(无参数)和 collection 构造方法。
与其他抽象 collection 实现不同,编程人员不必 提供迭代器实现;迭代器和列表迭代器由此类在以下“随机访问”方法上实现:get(int)、set(int, E)、add(int, E) 和 remove(int)。
此类中每个非抽象方法的文档详细描述了其实现。如果要实现的 collection 允许更有效的实现,则可以重写所有这些方法。
是不是看的不耐烦了,我也烦,但理解一个类的方法和实现思想,看文档是必须的(最好是英文)。
源码
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>{ //唯一的构造器,供子类构造使用,通常是隐式的 protected AbstractList(){ } //此列表结构改变的次数。 //结构改变指的是改变列表size的操作 //此变量用于Iterator和ListIterator的实现类,如果此变量意外的 改变,迭代器的next, remove ,previous set 或 add方法会抛出ConcurrentModificationException(fail-fast行为) protected transient int modCount = 0; public boolean add(E e){ add(size(), e); return true; } abstract public E get(int index);
一大堆抛出UnsupportedOperationException()的方法
public E set(int index, E element){ throw new UnsupportedOperationException(); } public void add(int index, E element){ throw new UnsupportedOperationException(); } public E remove(int index){ throw new UnsupportedOperationException(); }
搜索方法
关于Iterator 和 ListIterator 的介绍请看这里 java集合系列05 Iterable Iterator ListIterator
public int indexOf(Object o){ ListIterator<E> it = listIterator(); if(o == null){ while(it.hasNext()){ if(it.next() == null){ return it.previousIndex(); //因为调用next方法,指针(cursor)已经移向下一个元素,所以要返回cursor的前一个索引 } } }else{ while(it.hasNext()){ if(o.equals(it.next())){ return it.previouseIndex(); //同上 } } } return -1;}public int lastIndexOf(Object o){ ListIterator<E> it = listIterator(size()); if(o == null){ while(it.hasPrevious()){ if(it.previous() == null){ return it.nextIndex(); //调用it.nextIndex()返回当前cursor的值 } } }else{ while(it.hasPrevious()){ if(o.equals(it.previous()){ return it.nextIndex(); //同上 } } } return -1;}
返回迭代器的方法
关于Iterator 和 ListIterator 的介绍请看这里 java集合系列05 Iterable Iterator ListIterator
public Iterator<E> iterator(){ return new Itr();}public ListIterator<E> listIterator(){ reutrn listIterator(0);}public ListIterator<E> listIterator(final int index){ rangeCheckForAdd(index); return new ListItr(index);}//检查是否越界,最大值为size(),如果越界,抛出异常private void rangeCheckForAdd(int index){ if(index < 0 || index > size()) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }}//数组越界信息private String OutOfBoundsMsg(int index){ return "Index: " + index + ", Size: " + size();}
//范围删除,包含fromIndex, 不包含toIndex
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(); }}
//返回列表的视图
public List<E> subList(int fromIndex, int toIndex){ return (this instanceof RandomAccess ? new RandomAccessSubList<>(this, fromIndex, toIndex) : new SubList<>(this, fromIndex, toIndex));}
SubList视图简介
返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。(如果fromIndex和toIndex相等,则返回的列表为空)。返回的列表
- java集合系列06 AbstractList
- java集合分析(6):AbstractList
- Java 集合深入理解(6):AbstractList
- Java集合之AbstractList抽象类
- Java 集合深入理解(6):AbstractList
- Java 集合深入理解(6):AbstractList
- 解析java.util集合类源码(List和AbstractList篇)
- Java常见集合框架(三):List之List、AbstractList 、ArrayList
- java集合类库学习记录———AbstractList
- java.util.AbstractList翻译
- Java AbstractList 源代码分析
- 解析java.util集合类源码(AbstractList内部类ListIterator和Itr)
- Java集合源码学习(5)_List接口的基础实现AbstractList
- JAVA集合框架之AbstractCollection抽象类和AbstractList抽象类
- AbstractList
- AbstractList
- java的AbstractList源码分析
- 4-1、java.util.AbstractList
- MongoDB学习(二):数据类型和基本概念
- POJ3169_Layout_spfa && 最短路思想 求 差分约束系统
- 虚拟机修改ip地址和主机名
- get和post的区别--面试经常被问到!(一)
- Struts2的Hello Word
- java集合系列06 AbstractList
- Binary Watch
- java集合系列05 Iterable Iterator ListIterator
- 【论文阅读】SSD: Single Shot MultiBox Detector
- [Android]service list与dumpsys -l的结果差异分析
- 关于盒子制作的表格的双边框问题
- Linux常用命令学习
- 显示错误信息
- VS2010 CUDA8.0 工程配置