`
liuxinglanyue
  • 浏览: 562636 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

AbstractList类源代码欣赏

阅读更多

package java.util;


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


    // Search Operations

    /**
     * 返回列表中某个元素第一次出现的索引位置的方法
     */
    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());
    }

    /**
     * 从指定位置开始将Collection中的元素按迭代顺序加入到列表中
     */
    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;
    }


    
    /**
     * 返回内部实现的迭代器类Itr
     */
    public Iterator<E> iterator() {
	return new Itr();
    }

    /**
     *继承ListIterator类的方法
     */
    public ListIterator<E> listIterator() {
	return listIterator(0);
    }

    /**
     * 继承ListIterator类的方法
     */
    public ListIterator<E> listIterator(final int index) {
	if (index<0 || index>size())
	  throw new IndexOutOfBoundsException("Index: "+index);

	return new ListItr(index);
    }

     /**
     * 私有的内部类,实现了自己的Itertor
     */

    private class Itr implements Iterator<E> {
	/**
	 *调用next方法返回的元素索引值
	 */
	int cursor = 0;

	/**
	 * 调用next方法或者previous方法时返回的索引值,当调用deleted方法时该值重新置-1		 */
	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 e) {
	    if (lastRet == -1)
		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 {
		AbstractList.this.add(cursor++, e);
		lastRet = -1;
		expectedModCount = modCount;
	    } catch (IndexOutOfBoundsException ex) {
		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());
    }

    /**
     * 重写的hashcode方法
     */
    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();
        }
    }

    /**
     * 列表结构被修改的次数,比如列表的size变化或者打乱列表使得迭代结果不正确
     */
    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 e) {
                i.set(e);
            }

            public void add(E e) {
                i.add(e);
                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);
    }
}

 
分享到:
评论

相关推荐

    arrayList源代码

    ### ArrayList源代码解析 在Java集合框架中,`ArrayList`是一个非常重要的类,它实现了`List`接口,并提供了基于动态数组的数据结构。本篇将详细分析`ArrayList`的源码,帮助读者理解其内部实现机制。 #### 类定义...

    Java源代码

    Java源代码是学习Java编程语言的关键资源,它揭示了Java平台内部的工作原理和设计思想。通过对Java类库的源码进行阅读和分析,开发者可以深入理解语言机制,提高编程技能,以及解决实际问题的能力。以下将详细介绍...

    Java 实例 - 获取向量的最大元素源代码-详细教程.zip

    `Vector`类位于`java.util`包中,它是`AbstractList`和`Serializable`接口的实现,同时也实现了`Cloneable`接口。这意味着`Vector`可以被序列化,克隆,并且具有列表的所有操作。 要找到`Vector`中的最大元素,我们...

    abstract抽象类

    - 在Java集合框架中,许多接口的实现类都基于抽象类,如ArrayList和LinkedList都继承自AbstractList抽象类。 通过理解和熟练运用抽象类,开发者可以更好地设计和实现面向对象的程序,提高代码的复用性和可维护性。...

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

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

    java类的重用

    例如,`ArrayList`和`LinkedList`都继承自Java的`AbstractList`抽象类,它们共享了一些通用的列表操作。 **多态(Polymorphism)** 是面向对象编程的三大特性之一,意味着同一种行为在不同类中可能有不同的表现形式...

    Java4Android24_为什么用抽象类

    7. **JDK中的应用**:Java集合框架中的`AbstractList`, `AbstractSet`, `AbstractMap`等都是抽象类,它们提供了部分实现,子类只需实现剩余的方法即可。这大大简化了开发过程,提高了代码复用。 总之,抽象类在Java...

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

    抽象类主要用于代码复用,通过继承抽象类,子类可以获得父类的成员变量和方法实现。例如,`java.util.AbstractList`是集合框架中的一个抽象类,提供了列表操作的部分实现,如`ArrayList`就是基于它进行扩展的。 在...

    Java Collections中的Fail Fast机制

    本文章主要抽取了 Java Collections Framework 中的Collection 接口、List 接口、AbstractCollection 抽象类、AbstractList 抽象类和具体的ArrayList 的实现纵向研究了Java Collections Framework 中...源代码的研究。

    J2SE 1.6所有的类

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

    类集框架文档UTIL

    例如,可以通过实现`List`接口创建一个新的列表实现,或者通过继承`AbstractList`、`AbstractSet`等抽象类来减少编码工作。此外,`Collections`类提供了许多静态方法,如排序、复制、填充等,作为通用的算法,可以...

    MySql转Java实体类

    这样的工具可以自动解析SQL创建语句,生成相应的Java源代码,极大地提高了开发效率。通过输入SQL脚本或连接到数据库获取表结构,工具能够生成包含字段名、数据类型和注释的Java实体类。 3. **使用步骤** - **准备...

    java实用工具类

    它继承自`AbstractList`并实现了`List`接口。与ArrayList相比,Vector是线程安全的,但性能较低,因为它的每个操作都需要同步。 - `Stack`类:是`Vector`的一个子类,实现了一个后进先出(LIFO)的数据结构,即堆栈...

    JAVA初学教程教你学会JAVA4

    本文将深入探讨`AbstractList`类的重要性和使用场景,帮助初学者掌握如何利用`AbstractList`来创建自己的`List`实现。 #### 一、AbstractList简介 `AbstractList`是一个抽象类,位于`java.util`包中。它是`List`...

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

    本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码。 集合类的根接口Collection Collection接口是所有集合类的根类型。它的一个主要的...

    java编写的线性表

    此外,源代码中可能还包括测试类,用于验证线性表操作的正确性。测试类通常会创建一个线性表实例,然后执行插入、删除、查找等操作,并打印结果,以确保程序按照预期工作。 总之,这个“java编写的线性表”项目为...

    java代码开发文档

    Java代码开发文档旨在提供一套标准和最佳实践,以确保代码的可读性、可维护性和团队协作效率。本文档将详细阐述Java编程中的命名规范,这是编写清晰、一致且易于理解的代码的基础。 1. 介绍/说明 Java编程规范是...

    Java经典笔试题__附带答案

    5. **javac与Java命令**:`javac`用于编译Java源代码,而`java`命令则用于运行已编译的Java类。 6. **this关键字**:在子类构造函数中,`this`可以调用同一类的其他构造函数,而不是基类的构造函数。若要调用基类...

    java集合类

    此外,AbstractCollection和AbstractList等抽象类为自定义集合类提供了便利的基类。 在实际开发中,选择合适的集合类至关重要。例如,如果需要保持元素顺序且频繁进行遍历,ArrayList可能是最佳选择;如果关注的是...

Global site tag (gtag.js) - Google Analytics