ArrayList 与自制 仿ArrayList

最近在实习期被公司送到归谷培训,在老师布置做的时候,理论上用ArrayList很方便,只可以他还没讲,我自己用的话有种作弊的感觉,后来突发奇想相自己用数组写一个仿ArrayList.

/** 
* @ClassName: MyList 
* @Description: 仿ArrayList
* @author Lmc
* @date 2015-11-5 下午06:34:59 
*/
public class MyList<T>{
	/** 
	* @Fields defaultSize : 初始化数组长度
	* 默认长度应该为10,为了方便测试 定为2
	*/
	private int defaultSize = 2;  
	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
	//T[] entity;
	/** 
	* @Fields nowSize : 当前数组长度
	*/

	int size=0; 
	Object[] elementData;
	public MyList(){

		elementData = new Object[defaultSize];
	}
	public MyList(int listSize){
		if (listSize < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
            		listSize);
		elementData = new Object[listSize];
	}

	/** 
	* @Title: add 添加一个元素
	* @Description:   
	*/
	public void add(T element){
		//判断数组内元素个数是否超过上限,超过则扩充数组
		ensureCapacityInternal(size+1);//size+1为所需的最小容量
		elementData[size++] = element;

	}
	/** 
	* @Title: get 
	* @Description: 获取第index个元素
	*/
	public T get(int index){
		rangeCheck(index);
		return (T)elementData[index];
	}

    /** 
    * @Title: remove 
    * @Description:  移除list中的第index个元素
    * @return T     第index个元素
    */
    public T remove(int index) {
        rangeCheck(index);
        T oldValue =  (T)elementData[index];
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
        return oldValue;
    }

	/** 
	* @Title: size  
	* @Description:   获得当前数据的个数(也可以说是list的长度)
	*/
	public int size(){
		return size;
	}

	/** 
	* @Title: rangeCheck 
	* @Description: 判断index是否超过数组范围     
	*/
	private void rangeCheck(int index) {
		if (index < 0 || index >= this.size)
			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
	}

	/** 
	* @Title: outOfBoundsMsg 
	* @Description: 数组越界提示信息
	*/
	private String outOfBoundsMsg(int index) {
        return "Index: "+index+", Size: "+this.size;
    }

	/** 
	* @Title: ensureCapacityInternal 
	* @Description: 判断当前是否需要扩增数组大小
	* @param      size 当前数组里实际的元素个数
	*/
	private void ensureCapacityInternal(int minCapacity) {
		if(minCapacity - elementData.length > 0){
			grow(minCapacity);
		}
	}
	/** 
	* @Title: grow 
	* @Description: 增加数组的范围   数组大小变为原来的1.5倍
	* (jdk1.7)新特性如果扩容后仍小于最小需求容量,则直接扩容到最小需求容量  位运算速度快
	* (jdk1.6以前)则是扩容到1.5倍+1;
	*/
	private void grow(int minCapacity){
		int oldCapacity = elementData.length;
	    int newCapacity = oldCapacity + (oldCapacity >> 1);
		//Object[] newElementData = new Object[newCapacity];
		//System.arraycopy(elementData, 0, newElementData, 0, nowSize);
	    if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
	    elementData = Arrays.copyOf(elementData, newCapacity);
	   // System.out.println("开始扩增数组大小");
	}

	 /** 
	* @Title: hugeCapacity 
	* @Description: 处理扩容时 容量已经超过定义的最大容量  
	*/
	private static int hugeCapacity(int minCapacity) {
	        if (minCapacity < 0) // overflow
	            throw new OutOfMemoryError();
	        return (minCapacity > MAX_ARRAY_SIZE) ?
	            Integer.MAX_VALUE :
	            MAX_ARRAY_SIZE;
	    }

}
时间: 2024-08-04 23:13:39

ArrayList 与自制 仿ArrayList的相关文章

比较List和ArrayList的性能及ArrayList和LinkedList优缺点

List和ArrayList的性能比较 在使用ArrayList这样的非泛型集合的过程中,要进行装箱和拆箱操作,会有比较大的性能损失,而使用泛型集合就没有这样的问题.List是泛型,而ArrayList是非泛型.存数据岛ArrayList都需要专程object,读取又要转换成相应的数据类型,List则不需要. //用来记录开始和结束的时间 DateTime startTime = new DateTime(); DateTime endTime = new DateTime();//定义集合类型

java打乱ArrayList生成一个随机ArrayList列表

自己写了一个,有时候会有需要. public static <V> boolean isEmpty(ArrayList<V> sourceList) { return (sourceList == null || sourceList.size() == 0); } /** * 打乱ArrayList * * */ public static <V> ArrayList<V> randomList(ArrayList<V> sourceList)

javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)

我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们在列表中的位置被插入和访问.一个列表可以包含重复元素.List在集合中是一个比较重要的知识点也是在开发中最常用的. 我们都知道ArrayList是由数组实现的,但是和数组有很大区别的是随着向ArrayList中不断添加元素,其容量也自动增长,而数组声明好之后其容量就不会改变.想要探明其中的究竟探析其

5.秋招复习简单整理之请介绍一下List和ArrayList的区别,arrayList和HashSet区别?

第一问:List是接口,ArrayList是List的实现类. 第二问:ArrayList是List的实现类,HashSet是Set的实现类,List和Set都实现了Collection接口. ArrayList底层是动态数组,HashSet底层是哈希表. ArrayList存储的是对象的引用,HashSet存储的是之前检索对象用的hashcode,所以当存入对象时需要重写hashcode,如果只是比较对象,只需要重写equals方法. ArrayList存储有序可重复的数据,HashSet存储

为什么写List&lt;String&gt; list=new ArrayList&lt;String&gt;();而不写ArrayList&lt;String&gt; arrayList = new ArrayList&lt;&gt;();?

List<String> list=new ArrayList<String>();的核心是遵守了依赖倒转原则——细节依赖于抽象. ArrayList是实现了List这个接口的,将这个问题放大来看就是一个接口引用指向了一个实现了该接口的类的对象,这就和继承中的一个父类引用指向了它的子类对象相似. 这个样子的写法的好处是确保了list只能调用在List中已经定义过的方法,而不会调用到ArrayList新创建的方法,若是写为ArrayList<String> arrayLi

自制仿360首页支持拼音输入全模糊搜索和自动换肤

360首页搜索效果如下 1.完成编写的schoolnet校园网主要目录结构如下 主要实现支持中文.拼音首字母.拼音全字母的智能搜索和换肤 页面效果如下 主要核心代码如下 1.head.jsp <%@page import="java.io.File"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@

ArrayList以及Map小练

ArrayList常用方法 public static void main(String[] args) { List list = new ArrayList(); List list1 = new ArrayList(); for (int i = 0; i < 5; i++) { list.add(i, "string"+i);//add(E e)向某集合的尾部追加 list1.add(i, "string"+(i+10)); } List list2

java持有对象【2】ArrayList容器续解

此为JDK API1.6.0对ArrayList的解释. ArrayList 使用java泛型创建类很复杂,但是应用预定义的泛型很简单.例如,要想定义用来保存Apple对象的ArrayList,可以声明ArrayList<Apple>,尖括号内为类型参数,(可以为多个).它指定了容器可以保存的类型. 通过使用泛型,可以在编译期防止将错误类型的对象放置到容器中. ArrayList向上转型为List. 应该注意到,在将元素从List中取出时,类型转换不是必须的了.因为List在调用get()时会

手动添加arraylist注解类(Contact联系人对象)

因为在Java核心库不支持arraylist xml直接注解,这里可以自己写个小工具类 Contact.java: package com.newer.xml; import java.util.ArrayList; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.ElementList; import org.simp