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

ArrayList类源代码欣赏

阅读更多

package java.util;


public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;

    /**
     *ArrayList储存元素用的数组,显然该类是基于数组实现的
     */
    private transient Object[] elementData;

    /**
     * ArrayList的大小
     */
    private int size;

    /**
     * 构造器,根据传入数值来初始化elements数组的大小,即ArrayList的大小
     */
    public ArrayList(int initialCapacity) {
	super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
	this.elementData = new Object[initialCapacity];
    }

    /**
     * 默认构造器,ArrayList的大小为10
     */
    public ArrayList() {
	this(10);
    }

    /**
     * 传入Collection的构造器
     */
    public ArrayList(Collection<? extends E> c) {
	elementData = c.toArray();
	size = elementData.length;
	// c.toArray might (incorrectly) not return Object[] (see 6260652)
	if (elementData.getClass() != Object[].class)
	    elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

    /**
     * 重新调正elementDate数组大小,因为当ArrayList删除元素后elementDate的大小不
*会变
     */
    public void trimToSize() {
	modCount++;
	int oldCapacity = elementData.length;
	if (size < oldCapacity) {
            elementData = Arrays.copyOf(elementData, size);
	}
    }

    /**
     * 确定ArrayList容量大小的方法,它的扩充机制是旧的数组大小×1.5+1
     */
    public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
	}
    }

    /**
     * 返回ArrayList的大小
     */
    public int size() {
	return size;
    }

    /**
     * 判断ArrayList是否为空
     */
    public boolean isEmpty() {
	return size == 0;
    }

    /**
     *判断某个元素是否存在
	 */
    public boolean contains(Object o) {
	return indexOf(o) >= 0;
    }

    /**
     * 返回指定元素在ArrayList中第一次出现的位置
     */
    public int indexOf(Object o) {
	if (o == null) {
	    for (int i = 0; i < size; i++)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = 0; i < size; i++)
		if (o.equals(elementData[i]))
		    return i;
	}
	return -1;
    }

    /**
     *返回指定元素在ArrayList中最后一次出现的位置
     */
    public int lastIndexOf(Object o) {
	if (o == null) {
	    for (int i = size-1; i >= 0; i--)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = size-1; i >= 0; i--)
		if (o.equals(elementData[i]))
		    return i;
	}
	return -1;
    }

    /**
     * 克隆方法
     */
    public Object clone() {
	try {
	    ArrayList<E> v = (ArrayList<E>) super.clone();
	    v.elementData = Arrays.copyOf(elementData, size);
	    v.modCount = 0;
	    return v;
	} catch (CloneNotSupportedException e) {
	    // this shouldn't happen, since we are Cloneable
	    throw new InternalError();
	}
    }

    /**
     * 转化成数组方法
     */
    public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

    /**
     * 
     */
    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
	System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

    // Positional Access Operations

    /**
     * 根据索引获取元素
     */
    public E get(int index) {
	RangeCheck(index);

	return (E) elementData[index];
    }

    /**
     * 根据索引设置元素
     */
    public E set(int index, E element) {
	RangeCheck(index);

	E oldValue = (E) elementData[index];
	elementData[index] = element;
	return oldValue;
    }

    /**
     * 添加元素的方法
     */
    public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = e;
	return true;
    }

    /**
     *在某个索引位置后添加元素 
     */
    public void add(int index, E element) {
	if (index > size || index < 0)
	    throw new IndexOutOfBoundsException(
		"Index: "+index+", Size: "+size);

	ensureCapacity(size+1);  // Increments modCount!!
	System.arraycopy(elementData, index, elementData, index + 1,
			 size - index);
	elementData[index] = element;
	size++;
    }

    /**
     * 根据索引删除元素
     */
    public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved);
	elementData[--size] = null; // Let gc do its work

	return oldValue;
    }

    /**
     * 根据传入的元素删除相同的元素
     */
    public boolean remove(Object o) {
	if (o == null) {
            for (int index = 0; index < size; index++)
		if (elementData[index] == null) {
		    fastRemove(index);
		    return true;
		}
	} else {
	    for (int index = 0; index < size; index++)
		if (o.equals(elementData[index])) {
		    fastRemove(index);
		    return true;
		}
        }
	return false;
    }

    /*
     *根据索引快速删除元素,内部私有方法 
     */
    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

    /**
     * 清空ArrayList
     */
    public void clear() {
	modCount++;

	// Let gc do its work
	for (int i = 0; i < size; i++)
	    elementData[i] = null;

	size = 0;
    }

    /**
     * 将一个Collection中的元素全部添加
     */
    public boolean addAll(Collection<? extends E> c) {
	Object[] a = c.toArray();
        int numNew = a.length;
	ensureCapacity(size + numNew);  // Increments modCount
        System.arraycopy(a, 0, elementData, size, numNew);
        size += numNew;
	return numNew != 0;
    }

    /**
     *在某个索引位置后将一个Collection中的元素全部添加
     */
    public boolean addAll(int index, Collection<? extends E> c) {
	if (index > size || index < 0)
	    throw new IndexOutOfBoundsException(
		"Index: " + index + ", Size: " + size);

	Object[] a = c.toArray();
	int numNew = a.length;
	ensureCapacity(size + numNew);  // Increments modCount

	int numMoved = size - index;
	if (numMoved > 0)
	    System.arraycopy(elementData, index, elementData, index + numNew,
			     numMoved);

        System.arraycopy(a, 0, elementData, index, numNew);
	size += numNew;
	return numNew != 0;
    }

    /**
     * 删除某个区间之内的全部元素
     */
    protected void removeRange(int fromIndex, int toIndex) {
	modCount++;
	int numMoved = size - toIndex;
        System.arraycopy(elementData, toIndex, elementData, fromIndex,
                         numMoved);

	// Let gc do its work
	int newSize = size - (toIndex-fromIndex);
	while (size != newSize)
	    elementData[--size] = null;
    }

    /**
     * 检查索引位置的方法
     */
    private void RangeCheck(int index) {
	if (index >= size)
	    throw new IndexOutOfBoundsException(
		"Index: "+index+", Size: "+size);
    }

    /**
     * 保存一个ArrayList对象的状态到一个输出流中
     */
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
	// Write out element count, and any hidden stuff
	int expectedModCount = modCount;
	s.defaultWriteObject();

        // Write out array length
        s.writeInt(elementData.length);

	// Write out all elements in the proper order.
	for (int i=0; i<size; i++)
            s.writeObject(elementData[i]);

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

    }

    /**
     * 从一个输入流中重新组装一个ArrayList对象
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
	// Read in size, and any hidden stuff
	s.defaultReadObject();

        // Read in array length and allocate array
        int arrayLength = s.readInt();
        Object[] a = elementData = new Object[arrayLength];

	// Read in all elements in the proper order.
	for (int i=0; i<size; i++)
            a[i] = s.readObject();
    }
}

 
分享到:
评论

相关推荐

    c#重写ArrayList源代码

    总之,重写ArrayList源代码是一项深入理解C#集合类和OOP实践的任务。它不仅涉及基本的数据结构操作,还涉及性能优化、错误处理和设计模式的运用。这个过程会帮助开发者更好地掌握C#的内存管理、类型系统以及如何构建...

    arrayList源代码

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

    C#160使用对象ArrayList填充DataGrid 源代码

    为了将ArrayList中的数据填充到DataGrid,我们需要创建一个DataTable并映射到ArrayList中的对象,因为DataGrid默认使用DataTable作为数据源: ```csharp DataTable dataTable = new DataTable(); dataTable.Columns...

    使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();

    首先,ArrayList是.NET Framework中的一个类,它继承自System.Collections.ArrayList,主要用于存储动态大小的可变数组。ArrayList可以存储任何类型的对象,非常灵活,但不提供类型安全。在C#中,我们通常更推荐使用...

    JAVA基本类源代码

    这个压缩包“基本类源代码”很可能包含了Java语言中的一些基础类的源文件,例如`Object`类、`String`类、`Integer`类、`ArrayList`类等。这些类在Java开发中非常常见,深入理解它们的源代码对于提升编程技能和优化...

    164个完整的Java程序源代码

    4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们在源代码中会被广泛应用,用于数据的存储和操作。 5. **输入/输出流**:Java的I/O流系统广泛用于文件读写、网络通信等场景,源...

    07.【Scanner类、Random类、ArrayList类】.zip

    在Java编程语言中,`Scanner类`、`Random类`和`ArrayList类`是三个非常重要的基础组件,它们各自在不同的场景下发挥着关键作用。接下来,我们将详细探讨这三个类的功能、用法以及它们在实际编程中的应用。 首先,...

    java核心技术源代码

    - 集合框架:Java集合框架包括List、Set、Map等接口及其实现类,源代码将演示如何使用ArrayList、LinkedList、HashSet、HashMap等。 - 多线程:Java提供了Thread类和Runnable接口来实现并发,源码中会有线程同步、...

    ArrayList类操作程序实例

    ArrayList类是Java编程语言中一个常用的集合类,它属于Java集合框架的一部分,位于`java.util`包中。ArrayList是一个基于数组实现的动态列表,可以存储任何类型的数据,并且支持动态扩容。在本实例中,我们将深入...

    ArrayList集合工具类

    通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...

    java api源代码

    在Java API源代码中,我们可以找到许多关键的类,如`Object`、`String`、`ArrayList`、`HashMap`等。这些类是Java程序设计的基石,它们的实现细节对于优化代码性能,理解和解决运行时问题具有重要意义。 1. `Object...

    java源代码,java源代码

    Java源代码是编程世界的基石,它是Java程序员用Java语言编写的程序文本,包含了类、方法、变量等元素,是理解程序逻辑和功能的核心。在Java编程中,源代码通常以`.java`为扩展名,经过Java编译器的处理,会被转化为...

    Arraylist例子代码 java

    ArrayList是Java集合框架中的一种重要数据结构,它属于List接口的实现类,提供了动态数组的功能。ArrayList示例代码通常用于展示如何在Java程序中创建、添加、删除、修改和遍历元素。在这个Java demo中,我们可以...

    arraylist 类泛函实现内幕

    arraylist 类泛函实现内幕 让大家看看那个arraylist 怎么实现的 泛函是个新东西,所以呢错误难免。 如果代码有问题,请大家谅解,帮我完善他! 我的资源,你们可以转载。对于书籍,其版权归原书作者...

    Java自学程序源代码

    4. **集合框架**:Java集合框架包括ArrayList, LinkedList, HashMap等,源代码可能会有对这些数据结构的使用示例,帮助理解它们的特性和应用场景。 5. **输入/输出流**:I/O流在Java中用于读写文件或网络通信,源...

    ASP版ArrayList数组类

    ASP版ArrayList数组类 集成添加,修改,查询,删除,排序,比较等各种方法

    Java程序设计语言源代码

    通过源代码,可以深入理解类的构造器、封装、继承、接口实现、抽象类、访问修饰符等概念,以及如何利用这些特性设计出可扩展和维护的软件系统。 4. **JVM(Java虚拟机)**: 标签中的"JVM"指的是Java虚拟机,它是...

    Java面向对象程序设计课本例题源代码

    在源代码中,可能会看到Class类、Method类、Constructor类的使用。 以上知识点构成了Java面向对象编程的基础,通过分析和实践这些例题源代码,你可以深入理解Java的核心特性,并提高编程能力。记得不仅要阅读代码,...

    java简单实例程序源代码

    "java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...

    ArrayList的一个C++类模板实现

    总结起来,这个C++类模板实现的ArrayList利用双层散列技术提高了在大规模数据集上的性能,提供了类似于Java ArrayList的功能,同时利用C++的类模板机制实现了泛型编程,增加了代码的可复用性。通过深入理解这个实现...

Global site tag (gtag.js) - Google Analytics