`
默默的小熊
  • 浏览: 233314 次
社区版块
存档分类
最新评论

AbstractList

 
阅读更多

 

public abstract class AbstractList<E> extends AbstractCollection<E> implements
		List<E> {
	protected AbstractList() {
	}

	public boolean add(E o) {
		add(size(), o);
		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();
	}

	public int indexOf(Object o) {
		ListIterator<E> e = listIterator();
		if (o == null) {
			while (e.hasNext())
				if (e.next() == null)
					return e.previousIndex();
		} else {
			while (e.hasNext())
				if (o.equals(e.next()))
					return e.previousIndex();
		}
		return -1;
	}

	public int lastIndexOf(Object o) {
		ListIterator<E> e = listIterator(size());
		if (o == null) {
			while (e.hasPrevious())
				if (e.previous() == null)
					return e.nextIndex();
		} else {
			while (e.hasPrevious())
				if (o.equals(e.previous()))
					return e.nextIndex();
		}
		return -1;
	}

	public void clear() {
		removeRange(0, size());
	}

	public boolean addAll(int index, Collection<? extends E> c) {
		boolean modified = false;
		Iterator<? extends E> e = c.iterator();
		while (e.hasNext()) {
			add(index++, e.next());
			modified = true;
		}
		return modified;
	}

	public Iterator<E> iterator() {
		return new Itr();
	}

	public ListIterator<E> listIterator() {
		return listIterator(0);
	}

	public ListIterator<E> listIterator(final int index) {
		if (index < 0 || index > size())
			throw new IndexOutOfBoundsException("Index: " + index);

		return new ListItr(index);
	}

	private class Itr implements Iterator<E> {
		int cursor = 0;

		int lastRet = -1;
		int expectedModCount = modCount;

		public boolean hasNext() {
			return cursor != size();
		}

		public E next() {
			checkForComodification();
			try {
				E next = get(cursor);
				lastRet = cursor++;
				return next;
			} catch (IndexOutOfBoundsException e) {
				checkForComodification();
				throw new NoSuchElementException();
			}
		}

		public void remove() {
			if (lastRet == -1)
				throw new IllegalStateException();
			checkForComodification();

			try {
				AbstractList.this.remove(lastRet);
				if (lastRet < cursor)
					cursor--;
				lastRet = -1;
				expectedModCount = modCount;
			} catch (IndexOutOfBoundsException e) {
				throw new ConcurrentModificationException();
			}
		}

		final void checkForComodification() {
			if (modCount != expectedModCount)
				throw new ConcurrentModificationException();
		}
	}

	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 o) {
			if (lastRet == -1)
				throw new IllegalStateException();
			checkForComodification();

			try {
				AbstractList.this.set(lastRet, o);
				expectedModCount = modCount;
			} catch (IndexOutOfBoundsException e) {
				throw new ConcurrentModificationException();
			}
		}

		public void add(E o) {
			checkForComodification();

			try {
				AbstractList.this.add(cursor++, o);
				lastRet = -1;
				expectedModCount = modCount;
			} catch (IndexOutOfBoundsException e) {
				throw new ConcurrentModificationException();
			}
		}
	}

	public List<E> subList(int fromIndex, int toIndex) {
		return (this instanceof RandomAccess ? new RandomAccessSubList<E>(this,
				fromIndex, toIndex) : new SubList<E>(this, fromIndex, toIndex));
	}

	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());
	}

	public int hashCode() {
		int hashCode = 1;
		Iterator<E> i = iterator();
		while (i.hasNext()) {
			E obj = i.next();
			hashCode = 31 * hashCode + (obj == null ? 0 : obj.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();
		}
	}

	protected transient int modCount = 0;
}

class SubList<E> extends AbstractList<E> {
	private AbstractList<E> l;
	private int offset;
	private int size;
	private int expectedModCount;

	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;
		expectedModCount = 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) {
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException();
		checkForComodification();
		l.add(index + offset, element);
		expectedModCount = l.modCount;
		size++;
		modCount++;
	}

	public E remove(int index) {
		rangeCheck(index);
		checkForComodification();
		E result = l.remove(index + offset);
		expectedModCount = l.modCount;
		size--;
		modCount++;
		return result;
	}

	protected void removeRange(int fromIndex, int toIndex) {
		checkForComodification();
		l.removeRange(fromIndex + offset, toIndex + offset);
		expectedModCount = l.modCount;
		size -= (toIndex - fromIndex);
		modCount++;
	}

	public boolean addAll(Collection<? extends E> c) {
		return addAll(size, c);
	}

	public boolean addAll(int index, Collection<? extends E> c) {
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
					+ size);
		int cSize = c.size();
		if (cSize == 0)
			return false;

		checkForComodification();
		l.addAll(offset + index, c);
		expectedModCount = l.modCount;
		size += cSize;
		modCount++;
		return true;
	}

	public Iterator<E> iterator() {
		return listIterator();
	}

	public ListIterator<E> listIterator(final int index) {
		checkForComodification();
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
					+ size);

		return new ListIterator<E>() {
			private 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();
				expectedModCount = l.modCount;
				size--;
				modCount++;
			}

			public void set(E o) {
				i.set(o);
			}

			public void add(E o) {
				i.add(o);
				expectedModCount = l.modCount;
				size++;
				modCount++;
			}
		};
	}

	public List<E> subList(int fromIndex, int toIndex) {
		return new SubList<E>(this, fromIndex, toIndex);
	}

	private void rangeCheck(int index) {
		if (index < 0 || index >= size)
			throw new IndexOutOfBoundsException("Index: " + index + ",Size: "
					+ size);
	}

	private void checkForComodification() {
		if (l.modCount != expectedModCount)
			throw new ConcurrentModificationException();
	}
}

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<E>(this, fromIndex, toIndex);
	}
}
 

 

分享到:
评论

相关推荐

    JAVA初学教程教你学会JAVA4

    ### JAVA初学教程之AbstractList详解 对于Java初学者来说,理解Java集合框架的基本组成部分及其工作原理至关重要。本文将深入探讨`AbstractList`类的重要性和使用场景,帮助初学者掌握如何利用`AbstractList`来创建...

    Java源码分析:深入探讨Iterator模式

    `AbstractList`类是`List`接口的一个抽象实现,它为所有`List`子类提供了一个基本框架。在`AbstractList`类中,迭代器是由内部类`Itr`实现的。下面详细介绍`Itr`类的关键部分。 1. **构造函数**: - `AbstractList...

    基于java实现的GUI图形化界面的简单计算器,实现加减乘除、乘方,可以连续运算,带一定纠错功能

    `AbstractList`可能是作为`List`接口的一个抽象实现,提供了一些默认行为,而具体的数据结构实现(如`seqList.java`)则可能继承自`AbstractList`,覆盖或实现其方法,以满足特定的需求。 7. **类和对象**:每个`....

    java类库详解PDF格式的

    每个 PDF 文件都可能是一个专题,比如 `AbstractList.pdf` 可能详细介绍了 `AbstractList` 类的设计和使用,而 `java.io.pdf` 可能全面讲解了 Java I/O 流的用法和最佳实践。通过学习这些文档,开发者可以深入理解 ...

    java专题-迭代器

    `AbstractList`提供了一个`iterator()`方法,返回一个`Itr`对象,`Itr`是`AbstractList`的内部类,实现了`Iterator`接口,负责具体的遍历逻辑。 #### 结论 迭代器模式在Java中的应用非常广泛,尤其在集合框架中,...

    java集合学习笔记2018.5.10

    在继承关系方面,`ArrayList`继承自`AbstractList`,`AbstractList`又继承自`AbstractCollection`,同时`ArrayList`实现了`List`接口。`List`接口继承自`Collection`接口,`Collection`是最顶级的集合接口。这种层次...

    第13讲 谈谈接口和抽象类有什么区别?1

    例如,`java.util.AbstractList`是集合框架中的一个抽象类,提供了列表操作的部分实现,如`ArrayList`就是基于它进行扩展的。 在Java中,类通过`implements`关键字实现接口,通过`extends`关键字继承抽象类。例如,...

    Java程序设计 3 数组与集合.pptx

    * AbstractSequentialList抽象类,为了被类集使用并扩展AbstractList,该类集使用连续而不是随机方式访问其元素 * ArrayList通过扩展AbstractList来实现动态数组 * LinkedList通过继承AbstractSequentialList来实现...

    第05章 面向对象(下) 06 抽象类的基本概念

    此外,Java的`java.util.ArrayList`和`java.util.LinkedList`都是抽象类`java.util.AbstractList`的子类,它们都实现了`AbstractList`提供的接口和部分方法,但各自的实现方式不同,这体现了抽象类在代码结构和复用...

    深入浅出学习Java设计模式之迭代器模式[参考].pdf

    `AbstractList`抽象类提供了创建迭代器的工厂方法,这样每个具体的容器类(如ArrayList、LinkedList等)可以通过继承`AbstractList`并实现必要的方法来创建自己的迭代器。 迭代器模式的一个重要特性是多态迭代,这...

    Vector底层结构和源码分析

    public class Vector&lt;E&gt; extends AbstractList&lt;E&gt; implements List, RandomAccess, Cloneable, java.io.Serializable { ... } ``` Vector 底层也是一个对象数组,protected Object\[] elementData; 这个数组用于...

    java 自整理的基础面试知识

    例如,Vector、ArrayList既继承了AbstractList又实现了List接口,这是因为接口实现提供了默认实现,而直接继承AbstractList可以获取更多的抽象方法实现,节省代码量。装饰者模式在JDK中广泛应用,如Collections....

    【死磕Java集合】-集合源码分析.pdf

    LinkedList的继承体系中,它继承了AbstractSequentialList和AbstractList,实现了List、Queue和Deque接口。它的主要属性包括元素个数size、链表首节点first和链表尾节点last。 在LinkedList的源码中,我们可以看到...

    J2SE 1.6所有的类

    `AbstractCollection`、`AbstractList`、`AbstractMap`和`AbstractSet`是集合框架中的抽象类,它们为特定类型的集合提供了基本操作的骨架实现。例如,`AbstractList`为实现列表接口(如ArrayList和LinkedList)提供...

    Java 集合框架+集合实例

    - **AbstractList**:继承AbstractCollection并实现了大部分List接口功能。 - **AbstractSequentialList**:继承AbstractList,适合顺序访问而非随机访问。 - **AbstractSet**:实现了Set接口的一部分。 - **...

    java对象容器.docx

    - 通常,开发者应优先考虑使用已有的容器实现,但如果需要特定行为,可以创建自定义容器类,继承自AbstractCollection、AbstractList、AbstractSet或AbstractMap,以便利用已实现的方法。 总结来说,Java对象容器...

    java中文帮助文档[归类].pdf

    2. **集合框架**:Java集合框架包括AbstractCollection、AbstractList、AbstractSet等,这些抽象类提供了基本的集合操作,并为创建自定义集合类提供了便利。例如,AbstractList允许开发者实现列表接口而不必完全实现...

    java Collection 详细介绍

    - **描述**:`AbstractCollection` 是 `Collection` 接口的基本实现,它是 `AbstractList` 和 `AbstractSet` 的超类。如果你需要创建自定义的集合类型,可以考虑从 `AbstractCollection` 继承。 #### 5. **...

    Java.util包.docx

    而由于继承自AbstractList,ArrayList可以直接使用索引访问其元素,实现了RandomAccess接口,表明它支持高效的随机访问。 总之,Java.util.ArrayList是Java编程中非常重要的数据结构,它提供了一种动态、高效的方式...

    JAVA中的集合.docx

    - `Vector` 类:`Vector` 是一个线程安全的列表实现,它继承自 `AbstractList` 并实现了 `List` 接口。由于它的操作是同步的,因此在多线程环境中更安全,但在单线程环境下,它的性能通常比非同步的 `ArrayList` 差...

Global site tag (gtag.js) - Google Analytics