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相等,则返回的列表为空)。返回的列表

0 0
原创粉丝点击