java集合分析(6):AbstractList
来源:互联网 发布:创维电视如何连接网络 编辑:程序博客网 时间:2024/06/05 21:54
package java.util; /** * List 接口的骨干实现,分别有类ArrayList,Vector,内部类SubList,抽象类AbstractSequentialList实现了该接口 * 。注意:对于连续的访问数据(如链表),应优先使用 AbstractSequentialList,而不是此类(jdk说明). * 要实现不可修改的列表,编程人员只需扩展此类,并提供 get(int) 和 size() 方法的实现。 */ public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { protected AbstractList() { } /** 将指定的元素添加到此列表的尾部,该方法需要具体的实现类去重写。 */ public boolean add(E e) { add(size(), e); return true; } /** 按序号获取元素 */ abstract public E get(int index); /** 待实现的在指定位置设置元素的方法 */ 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(); } /** * 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1 * ,注意使用的是ListIterator,如果用hasNext(),则索引是值previousIndex * (),按顺序搜索,自前向后,调用hasNext() */ public int indexOf(Object o) { ListIterator<E> it = listIterator(); if (o == null) { while (it.hasNext()) if (it.next() == null) return it.previousIndex(); } else { while (it.hasNext()) if (o.equals(it.next())) return it.previousIndex(); } return -1; } /** * 返回此列表中最后一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1 ,和indexOf(E e)逆向,这里迭代肯定只能用 * hasPrevious()了 */ public int lastIndexOf(Object o) { ListIterator<E> it = listIterator(size()); if (o == null) { while (it.hasPrevious()) if (it.previous() == null) return it.nextIndex(); } else { while (it.hasPrevious()) if (o.equals(it.previous())) return it.nextIndex(); } return -1; } /** 删除list中所有元素,这个方法调用 removeRange */ public void clear() { removeRange(0, size()); } /** * 在指定集合中的所有元素进行迭代,并插入本list中,插入位置为指定的位置开始,如果原有位置有元素,那么原来该位置开始的所有元素将统一向后移动,注意 * : 插入的仅仅只是一个引用,并没有进行克隆 */ public boolean addAll(int index, Collection<? extends E> c) { // 游标检查 rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; } /** 返回此列表的元素上进行迭代的通用Collection迭代器 */ public Iterator<E> iterator() { return new Itr(); } /** 返回此列表的元素上进行迭代的ListIterator迭代器 */ public ListIterator<E> listIterator() { return listIterator(0); } /** * 返回从指定位置起始的ListIterator迭代器,注意:指定的索引表示 next 的初始调用所返回的第一个元素。previous * 方法的初始调用将返回索引比指定索引少 1 的元素,实际上次迭代器调用的是已经实现的内部迭代器ListItr */ public ListIterator<E> listIterator(final int index) { rangeCheckForAdd(index); return new ListItr(index); } /** * 通用迭代器Iterator的第一个内部实现,用来聚集内部元素并访问,可称之为内聚子 */ private class Itr implements Iterator<E> { // 下一个元素的游标,从起始位置开始 int cursor = 0; // 上一次使用的游标 ,如果元素被删除或者不存在,返回-1 int lastRet = -1; // 抛出异常的次数,默认为modCount(参考其说明),遍历过程中,如果进行修改,那么这个值将发生变化,进而抛出异常 int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public E next() { // 检查list结构是否改变,如果改变将抛出 ConcurrentModificationException checkForComodification(); try { int i = cursor; E next = get(i); lastRet = i; cursor = i + 1; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { // 因为迭代时,已经迭代至下一个了,所以此处删除的是lastRet AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } // 检查是否在迭代过程中,list的结构发生改变 final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } } /** * 内聚子的派生类,也是对外提供的迭代器,新派生hasPrevious();previous();nextIndex();previousIndex( * );set();add()等方法 */ private class ListItr extends Itr implements ListIterator<E> { ListItr(int index) { cursor = index; } // 是否存在下一元素,逆序 public boolean hasPrevious() { return 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(); } } public int nextIndex() { return cursor; } public int previousIndex() { return 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(); } } 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(); } } } /** * List的截取方法, 返回列表中指定的 fromIndex(包括 )和 * toIndex(不包括)之间的部分视图,注意:1.这是一个前闭后开的区间,如果 fromIndex=toIndex,则返回空的List视图,2. * 此截取方法返回的List是SubList或者RandomAccessSubList,这两个内部子表是不支持序列化的 */ public List<E> subList(int fromIndex, int toIndex) { return (this instanceof RandomAccess ? new RandomAccessSubList<>(this, fromIndex, toIndex) : new SubList<>(this, fromIndex, toIndex)); } /** * 注意对象相等的条件:大小相同,顺序相同,元素相等,3个条件缺一不可 */ 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的hash码,计算方法为list中的每个元素的哈希吗*31加起来,null元素的哈希吗为0 */ public int hashCode() { int hashCode = 1; for (E e : this) hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode()); return hashCode; } /** 从指定位置到截止位置删除元素 (如果存在),前闭后开 */ 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(); } } /** * 已从结构上修改 此列表的次数。从结构上修改是指更改列表的大小,或者打乱列表,从而使正在进行的迭代产生错误的结果, * 如果意外更改了此字段中的值,则迭代器 (或列表迭代器)将抛出 ConcurrentModificationException 来响应 * next、remove、previous、set 或 add 操作。在迭代期间面临并发修改时,它提供了快速失败 行为,而不是非确定性行为。 */ protected transient int modCount = 0; /** 下标越界异常加测 */ 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(); } } /** * 内部子表,用于截取list的一段,此list未进行序列化,可以看做是仅仅把起始位置和终止位置改变的一端list,其余方法不变 */ class SubList<E> extends AbstractList<E> { private final AbstractList<E> l; // 偏移位置(起始位置) private final int offset; // 子表大小 private int size; SubList(AbstractList<E> list, int fromIndex, int toIndex) { if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); if (toIndex > list.size()) throw new IndexOutOfBoundsException("toIndex = " + toIndex); if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); l = list; offset = fromIndex; size = toIndex - fromIndex; this.modCount = l.modCount; } public E set(int index, E element) { rangeCheck(index); checkForComodification(); return l.set(index + offset, element); } public E get(int index) { rangeCheck(index); checkForComodification(); return l.get(index + offset); } public int size() { checkForComodification(); return size; } public void add(int index, E element) { rangeCheckForAdd(index); checkForComodification(); l.add(index + offset, element); this.modCount = l.modCount; size++; } public E remove(int index) { rangeCheck(index); checkForComodification(); E result = l.remove(index + offset); this.modCount = l.modCount; size--; return result; } protected void removeRange(int fromIndex, int toIndex) { checkForComodification(); l.removeRange(fromIndex + offset, toIndex + offset); this.modCount = l.modCount; size -= (toIndex - fromIndex); } public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } public boolean addAll(int index, Collection<? extends E> c) { rangeCheckForAdd(index); int cSize = c.size(); if (cSize == 0) return false; checkForComodification(); l.addAll(offset + index, c); this.modCount = l.modCount; size += cSize; return true; } public Iterator<E> iterator() { return listIterator(); } public ListIterator<E> listIterator(final int index) { checkForComodification(); rangeCheckForAdd(index); return new ListIterator<E>() { private final ListIterator<E> i = l.listIterator(index + offset); public boolean hasNext() { return nextIndex() < size; } public E next() { if (hasNext()) return i.next(); else throw new NoSuchElementException(); } public boolean hasPrevious() { return previousIndex() >= 0; } public E previous() { if (hasPrevious()) return i.previous(); else throw new NoSuchElementException(); } public int nextIndex() { return i.nextIndex() - offset; } public int previousIndex() { return i.previousIndex() - offset; } public void remove() { i.remove(); SubList.this.modCount = l.modCount; size--; } public void set(E e) { i.set(e); } public void add(E e) { i.add(e); SubList.this.modCount = l.modCount; size++; } }; } public List<E> subList(int fromIndex, int toIndex) { return new SubList<>(this, fromIndex, toIndex); } private void rangeCheck(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } 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; } private void checkForComodification() { if (this.modCount != l.modCount) throw new ConcurrentModificationException(); } } /** * 实现了RandomAccess接口的子表,其目的是:用来表示只是随机方法 */ class RandomAccessSubList<E> extends SubList<E> implements RandomAccess { RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) { super(list, fromIndex, toIndex); } public List<E> subList(int fromIndex, int toIndex) { return new RandomAccessSubList<>(this, fromIndex, toIndex); } }
转自: http://blog.csdn.net/yxyxaut/article/details/50589337
阅读全文
0 0
- java集合分析(6):AbstractList
- Java 集合深入理解(6):AbstractList
- Java 集合深入理解(6):AbstractList
- Java 集合深入理解(6):AbstractList
- Java AbstractList 源代码分析
- java集合系列06 AbstractList
- java的AbstractList源码分析
- Java集合之AbstractList抽象类
- 解析java.util集合类源码(List和AbstractList篇)
- Java常见集合框架(三):List之List、AbstractList 、ArrayList
- java集合类库学习记录———AbstractList
- 源码分析-java-AbstractList-Itr和ListItr的实现
- 源码分析-java-AbstractList-subList、RandomAccess、equals和hashCode
- AbstractList源码分析
- java.util.AbstractList翻译
- Iterator深究&AbstractList源码分析
- android中AbstractList代码分析
- 解析java.util集合类源码(AbstractList内部类ListIterator和Itr)
- Ext.form.FormPanel 综合实例
- pageContext.request.contextPath 绝对路径
- java poi 导入excel
- Scrapy 和 scrapy-redis的区别
- makefile 坑若干
- java集合分析(6):AbstractList
- 自定义JAVA线程池拒绝策略
- Linux的初步学习(3)
- CentOS免密登录设置
- HTML5实现图片压缩上传功能
- HOG+LBP+Haar
- 我的第一篇博客————从TI创新实验室开始
- 【oracle无法远程连接】oracle设置允许远程连接
- IndicateProgressBar 带指示器的ProgressBar进度条