`

今天看JDK的一些原码,头都大了。。。

阅读更多
public interface Iterator<E> {
	 boolean hasNext();		//是否有下一个元素
	 E next();				//下一个元素
	 void remove();			//删除
}

public interface Collection<E> extends Iterable<E> {
	int size();							//包函的元素
	boolean isEmpty();					//是否为空
	boolean contains(Object o);			//是否包括o
	Iterator<E> iterator();				//生成Iterator对象
	Object[] toArray();					//生成数组对象
	<T> T[] toArray(T[] a);				//
	boolean add(E o);					//加一个对象
	boolean remove(Object o);			//删除一个对象
	boolean containsAll(Collection<?> c);			//
	boolean addAll(Collection<? extends E> c);		//添加所有的到当前集合,包括extends E的
	boolean removeAll(Collection<?> c);				//
	boolean retainAll(Collection<?> c);				//
	void clear();									//清除
	boolean equals(Object o);						//
	int hashCode();									//
}

public interface List<E> extends Collection<E> {
	 int size();
	 boolean isEmpty();
	 boolean contains(Object o);
	 Iterator<E> iterator();
	 Object[] toArray();
	 <T> T[] toArray(T[] a);
	 boolean add(E o);
	 boolean remove(Object o);
	 boolean containsAll(Collection<?> c);
	 boolean addAll(Collection<? extends E> c);
	 boolean addAll(int index, Collection<? extends E> c);
	 boolean removeAll(Collection<?> c);
	 boolean retainAll(Collection<?> c);
	 void clear();
	 boolean equals(Object o);
	 int hashCode();
	 //List接口里面自己的方法
	 E get(int index);									//根据index值出相应的对象
	 E set(int index, E element);						//设置相应位置的对象
	 void add(int index, E element);					//增加相应位置的对象
	 E remove(int index);								//删除
	 int indexOf(Object o);								//根据对象获得相应对象的位置,没有找到应该会是-1
	 int lastIndexOf(Object o);							//是最后一个开始找吧(不知道)
	 ListIterator<E> listIterator();					//成生ListIterator对象,链表实现的吧
	 ListIterator<E> listIterator(int index);			//成生ListIterator对象,从index开始生成
	 List<E> subList(int fromIndex, int toIndex);		//从fromIndex到toIndex生成新的List对象
}

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
	private static final long serialVersionUID = 8683452581122892189L;				//我不知道为什么会有一个这样的变量
	private transient E[] elementData;												//用来保存E的数组,ArrayList是数组实现的
	private int size;																//指这个数组保存的个数,并不是数组的大小
	private int modCount;

	//构造方法	
	public ArrayList(int initialCapacity) {
		super();
        if (initialCapacity < 0){
            throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
		}
		this.elementData = (E[])new Object[initialCapacity];
    }

	public ArrayList() {
		this(10);
    }
	
	public ArrayList(Collection<? extends E> c) {
        size = c.size();
        // Allow 10% room for growth
        int capacity = (int)Math.min((size*110L)/100, Integer.MAX_VALUE);
        elementData = (E[])c.toArray(new Object[capacity]);
    }
	
	/**
	 *	看数组里面的元素和数组本身的长度,如果size<length就可以缩小
	 *
	 */
	public void trimToSize() {
		modCount++;														//这个到底是干什么用的?
		int oldCapacity = elementData.length;
		if (size < oldCapacity) {
			Object oldData[] = elementData;
			elementData = (E[])new Object[size];
			System.arraycopy(oldData, 0, elementData, 0, size);
		}
    }
	//扩大容量
	public void ensureCapacity(int minCapacity) {
		modCount++;
		int oldCapacity = elementData.length;
		if (minCapacity > oldCapacity) {
			Object oldData[] = elementData;
			int newCapacity = (oldCapacity * 3)/2 + 1;				//JDK1.5是这样写的哦,不知道为什么?
			if (newCapacity < minCapacity){
				newCapacity = minCapacity;							//他的容量并一定扩大到minCapacity,满足条件才会扩大到那样
			}
			elementData = (E[])new Object[newCapacity];
			System.arraycopy(oldData, 0, elementData, 0, size);
		}
    }

	public int size() {
		return size;
    }

	public boolean isEmpty() {
		return size == 0;
    }
	//查个某个对象在数组中的位置,是否相于根据对象的equals方法
	public int indexOf(Object elem) {
		if (elem == null) {
			for (int i = 0; i < size; i++)
			if (elementData[i]==null)
				return i;
		} else {
			for (int i = 0; i < size; i++)
			if (elem.equals(elementData[i]))
				return i;
		}
		return -1;
    }
	//这个方法和上面一个意思
	public boolean contains(Object elem) {
		return indexOf(elem) >= 0;
    }
	//很明显这个方法是从后向前找的
	public int lastIndexOf(Object elem) {
		if (elem == 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 (elem.equals(elementData[i]))
				return i;
		}
		return -1;
    }
	//克隆
	//先复制这个对象,再复制这个对象中数组对象
	public Object clone() {
		try { 
			ArrayList<E> v = (ArrayList<E>) super.clone();
			v.elementData = (E[])new Object[size];
			System.arraycopy(elementData, 0, v.elementData, 0, size);
			v.modCount = 0;
			return v;
		} catch (CloneNotSupportedException e) { 
			// this shouldn't happen, since we are Cloneable
			throw new InternalError();
		}
    }
	
	public Object[] toArray() {
		Object[] result = new Object[size];
		System.arraycopy(elementData, 0, result, 0, size);
		return result;
    }
	//不知道什么意思。。。。
	public <T> T[] toArray(T[] a) {
        if (a.length < size){
            a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
		}
		System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size){
            a[size] = null;
		}
        return a;
    }
	//获得
	public E get(int index) {
		RangeCheck(index);	//看是否超出size的大小
		return elementData[index];
    }
	//设置
	public E set(int index, E element) {
		RangeCheck(index);
		E oldValue = elementData[index];
		elementData[index] = element;
		return oldValue;
    }
	//增加一个对象
	public boolean add(E o) {
		ensureCapacity(size + 1);  // Increments modCount!!
		elementData[size++] = o;
		return true;
    }
	//在index这个位置后面加个对象进去
	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 = 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方法了
	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
    }

	public void clear() {
		modCount++;
		// Let gc do its work
		for (int i = 0; i < size; i++){
			elementData[i] = null;
		}			
		size = 0;
    }

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

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

	 private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{
		int expectedModCount = modCount;
		// Write out element count, and any hidden stuff
		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();
		}
    }

	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 = (E[])new Object[arrayLength];

		// Read in all elements in the proper order.
		for (int i=0; i<size; i++){
				a[i] = s.readObject();
			}
		}
}
public class Vector<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable{

	protected Object[] elementData;
	protected int elementCount;
	protected int capacityIncrement;

	public Vector(int initialCapacity, int capacityIncrement) {
		super();
        if (initialCapacity < 0){
            throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
		}
		this.elementData = new Object[initialCapacity];
		this.capacityIncrement = capacityIncrement;
    }

	public Vector(int initialCapacity) {
		this(initialCapacity, 0);
    }

	public Vector() {
		this(10);
    }

	 public Vector(Collection<? extends E> c) {
        elementCount = c.size();
        // 10% for growth
        elementData = new Object[(int)Math.min((elementCount*110L)/100,Integer.MAX_VALUE)]; 
        c.toArray(elementData);
    }
	//把这个Vector对象的数组复制到别一个去
	public synchronized void copyInto(Object[] anArray) {
		System.arraycopy(elementData, 0, anArray, 0, elementCount);
    }
	
	public synchronized void trimToSize() {
		modCount++;
		int oldCapacity = elementData.length;
		if (elementCount < oldCapacity) {
			Object oldData[] = elementData;
			elementData = new Object[elementCount];
			System.arraycopy(oldData, 0, elementData, 0, elementCount);
		}
    }

	 public synchronized void ensureCapacity(int minCapacity) {
		modCount++;
		ensureCapacityHelper(minCapacity);
    }
    
	private void ensureCapacityHelper(int minCapacity) {
		int oldCapacity = elementData.length;
		if (minCapacity > oldCapacity) {
			Object[] oldData = elementData;
			int newCapacity = (capacityIncrement > 0)?(oldCapacity+capacityIncrement):(oldCapacity*2);
			if (newCapacity < minCapacity) {
				newCapacity = minCapacity;
			}
			elementData = new Object[newCapacity];
			System.arraycopy(oldData, 0, elementData, 0, elementCount);
		}
    }

	public synchronized void setSize(int newSize) {
		modCount++;
		if (newSize > elementCount) {
			ensureCapacityHelper(newSize);
		} else {
			for (int i = newSize ; i < elementCount ; i++) {
			elementData[i] = null;
			}
		}
		elementCount = newSize;
	}

	public synchronized int capacity() {
		return elementData.length;
    }

	public synchronized int size() {
		return elementCount;
    }

	public synchronized boolean isEmpty() {
		return elementCount == 0;
    }

	public Enumeration<E> elements() {
		return new Enumeration<E>() {
		 int count = 0;
	    public boolean hasMoreElements() {
		return count < elementCount;
	    }

	    public E nextElement() {
		synchronized (Vector.this) {
		    if (count < elementCount) {
			return (E)elementData[count++];
		    }
		}
		throw new NoSuchElementException("Vector Enumeration");
	    }
	};
    }

	public boolean contains(Object elem) {
		return indexOf(elem, 0) >= 0;
    }

	public int indexOf(Object elem) {
		return indexOf(elem, 0);
    }

	public synchronized int indexOf(Object elem, int index) {
		if (elem == null) {
			for (int i = index ; i < elementCount ; i++)
			if (elementData[i]==null)
				return i;
		} else {
			for (int i = index ; i < elementCount ; i++)
			if (elem.equals(elementData[i]))
				return i;
		}
		return -1;
    }

	public synchronized int lastIndexOf(Object elem) {
		return lastIndexOf(elem, elementCount-1);
    }

	public synchronized int lastIndexOf(Object elem, int index) {
        if (index >= elementCount)
            throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
		if (elem == null) {
			for (int i = index; i >= 0; i--)
			if (elementData[i]==null)
				return i;
		} else {
			for (int i = index; i >= 0; i--)
			if (elem.equals(elementData[i]))
				return i;
		}
		return -1;
	}

	public synchronized E elementAt(int index) {
		if (index >= elementCount) {
			throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
		}
        return (E)elementData[index];
    }

	//........................................
}

public class Stack<E> extends Vector<E> {
	public Stack() {

    }

	public E push(E item) {
		addElement(item);				//父类的方法
		return item;
    }

	public synchronized E pop() {
		E obj;
		int	len = size();

		obj = peek();
		removeElementAt(len - 1);

		return obj;
    }

	public synchronized E peek() {
		int	len = size();

		if (len == 0)
			throw new EmptyStackException();
		return elementAt(len - 1);
    }

	public boolean empty() {
		return size() == 0;
    }

	public synchronized int search(Object o) {
		int i = lastIndexOf(o);

		if (i >= 0) {
			return size() - i;
		}
		return -1;
    }
}
分享到:
评论
1 楼 hyxw5890 2009-02-04  
Google首席Java架构师自认为最自豪的代码就这么令人读起来头大吗?呵呵,开个玩笑

相关推荐

    jdk-8u60源码

    《深入解析JDK 8u60源码》 JDK(Java Development Kit)是Java编程语言的核心组件,包含了编译器、运行时环境、工具集等,是开发者理解和使用Java技术的重要基石。JDK 8u60是Oracle公司发布的一个版本,包含了对...

    java入门很简单原码

    面向对象编程(OOP)的三大原则——封装、继承和多态,也是Java的重要知识点。封装是将数据和操作数据的方法捆绑在一起,保护数据不被外部随意访问。继承则允许一个类(子类)继承另一个类(父类)的属性和方法,...

    JDK13_SourceCode:JDK13源码阅读

    JDK13在垃圾收集器方面也有改进,例如ZGC(Z Garbage Collector)的优化,提升了大规模内存应用的性能。ZGC是一个低暂停时间的垃圾收集器,它的设计目标是在大内存场景下,实现接近于常量的垃圾回收暂停时间。 在...

    java_jdk反编译工具

    反编译JAVA.class文件,特别是在没有原码地情况 ,适时地进行反编译,可以看到相关地原码!

    支付宝转帐到个人JAVA原码

    2. `bcprov-jdk15to18-167.jar`:这是Bouncy Castle加密库,它提供了Java标准库中未包含的一些加密算法和功能,对于处理数字证书和加密操作是必需的。 3. `alipay-easysdk-2.1.0.jar`:这是支付宝易用性SDK,可能...

    从原码解析ArrayList

    然而,在JDK 1.8及之后的版本中,如果通过无参数构造函数创建ArrayList,初始容量实际上是0,直到添加第一个元素时才会扩展到10。 2. **RandomAccess接口** ArrayList实现了RandomAccess接口,这是一个标志性的...

    jdk-API1.6.zip

    API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。 [1] 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问...

    合工大Java实验报告源代码

    在本压缩包文件中,我们聚焦于...每个实验都提供了一个具体的场景,帮助学生将理论知识应用于实践中,从而加深理解并增强技能。通过完成这些实验,学生不仅能够掌握Java编程技术,还能提升问题解决和项目管理的能力。

    java项目之基于ssm的非物质文化网站的设计与开发(源码+万字报告文档+部署说明+ppt)

    源码均经过严格测试,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! 非物质文化遗(1) 首页...JDK版本:JDK1.8 数据库:mysql 数据库管理工具:Navicat 开发软件:eclipse/myeclipse/idea

    java基础,进制转换.pdf

    正数的原码、反码、补码都相同,而负数则不同。 5. 二进制数的计算原理 - 计算中的加法原理:计算机内部的数值运算基于二进制加法。在处理负数时,会用到反码和补码的概念。 - 二进制数的算术运算:例如,30 - 70...

    java开发毕业设计-基于SpringBoot+Vue的外卖点餐系统源码+数据库

    java毕业设计之外卖点餐系统(项目源码+...JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5+(最好5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器

    Android8.0 源代码(O)

    5. **jdk**: Java开发工具包(JDK)的源代码,对于理解Java语言底层机制和Android如何与Java SE兼容非常有帮助。在这里,你可以看到类库的实现,如集合、IO、网络等,这些是构建Android应用的基础。 6. **...

    sun.misc.Unsafe源码

    首先,`sun.misc.Unsafe`并不是Java标准API的一部分,而是Oracle JDK的一个内部实现细节,因此其行为和存在可能在未来的JDK版本中发生变化。这个类提供了一些高级功能,如对象字段的直接访问、内存分配、原子操作等...

    Java零基础学习视频篇+工程第一章

    这个资源包包含了两大部分:资料篇和视频篇,两者都会随着内容的更新而不断丰富。 资料篇可能包含Java编程的基础文档、实例代码、项目案例以及学习指南等,旨在提供理论知识的支持和实践操作的参考。这部分内容对于...

    精通Spring源代码.rar

    通过研究源代码,我们可以深入了解这些特性的实现原理,这对于提升开发技能、优化代码质量以及解决实际问题具有极大价值。 1. **依赖注入(Dependency Injection,DI)**:Spring的核心特性之一,它允许开发者在...

    apollo-0.9.1.zip(阿波罗配置中心源码)

    1. **配置的集中存储**:所有应用的配置都统一存放在阿波罗配置中心,便于管理、备份和恢复。 2. **配置的实时推送**:当配置发生变更时,阿波罗能够实时推送到相关的服务实例,确保配置的及时生效。 3. **多环境...

    java毕业设计之新闻发布管理系统源码(前后端完整源代码).zip

    本系统前端主要功能包括新闻、公告的查看,在线留言等。后台主要功能包括新闻管理、留言管理、...JDK版本:JDK1.8 服务器:tomcat7+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件: idea Maven包:Maven3.3.9+

    初识JVM – JVM概念.pdf

    - **2014年**:JDK 8引入了Lambda表达式和类型注解等新特性,极大地提高了编程效率。 - **2016年**:JDK 9标志着模块化的开始,这是Java发展史上的一个重要里程碑。 #### 三、JVM历史大事记 - **HotSpot**:最初由...

    JAVAweb客户管理系统源码eclipse版.rar

    JavaWeb客户管理系统是一款基于Eclipse开发的Web应用,主要利用了Spring、Struts2和Hibernate(SSH)三大框架,构建了MVC模式的项目结构。这个项目是为新手学习和二次开发设计的,使用JDK1.7版本,确保了在较旧的...

Global site tag (gtag.js) - Google Analytics