`

ArrayList的实现

    博客分类:
  • Java
阅读更多

用到的知识:

1.泛型

 

public class ArrayQueue<E> {}//E表示元素是什么类型,element

2.容量(arr.length)

private int initVolume;

3.增长比率

 

private int GrowthRate;

4.数组长度

 

 

private int length=0;

目的:用动态数组实现增加元素,插入元素,移除元素,修改元素等操作

Object[] src=new Object[0];

add思路:在已知数组最末尾增加元素,先建立新的数组,并初始化容量为旧数组+1,将旧数组拷贝到新数组,新元素增加到末尾,用新数组替换旧数组

实现:

public void add(E s){
		//定义一个新数组,用来装数据,长度比src+1
		Object []dest =new Object[src.length+1];
		//将新加进的元素放入新数组的最后一个下标位置
		dest[dest.length-1]=s;
		//将原来数组中的数据按照下标顺序拷贝到新数组
		for(int i=0;i<src.length;i++){
			dest[i] = src[i];
		}
		
		//将src指向新数组
		src = dest;
}

 insert思路:add类似,将旧数组分为两个部分,一部分拷贝到新数组,将插入的元素放到指定位置,再拷贝剩余部分到新数组

实现:

/**
	 * 将指定元素插入到指定位置
	 * @param index 要插入元素的位置,第index个元素
	 * @param s 要插入的新元素
	 */
	public void insert(int index, E s) {
		//定义一个新数组,用来装数据,长度比src+1
				Object []dest =new Object[src.length+1];
				
				if(index>=0&&index<dest.length){
				//将原来数组中的数据按照下标顺序拷贝到新数组
				for(int i=0;i<index;i++){
					dest[i] = src[i];
				}
				for(int i=index;i<src.length;i++){
					dest[i+1] = src[i];
				}
				//将新加进的元素放入新数组的相应位置
				dest[index]=s;
				
				//将src指向新数组
				src = dest;
				}
				
				else{
					System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");
				}
	}

 

移除操作:思路和插入差不多

/**
	 * 移除指定位置的元素
	 * @param index
	 *            要移除的元素的下标,0-src.length-1;
	 */
	public void remove(int index) {
		//定义一个新数组,用来装数据,长度比src+1
		Object []dest =new Object[src.length-1];
		
		if(index>=0&&index<dest.length){
		//将原来数组中的数据按照下标顺序拷贝到新数组
		for(int i=0;i<index;i++){
			dest[i] = src[i];
		}
		for(int i=index;i<src.length-1;i++){
			dest[i] = src[i+1];
		}		
		//将src指向新数组
		src = dest;
		}
		else{
			System.out.println("删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");
		}
	}

 

上述程序每增加一个数据都得重新分配空间,改进后程序如下:

public class ArrayQueue<E> {//E表示元素是什么类型,element
	private int initVolume;
	private int GrowthRate;
	private int length=0;
	Object[] src;
	
	public ArrayQueue(){
		this.initVolume=900000;
		this.GrowthRate=10000;
		src=new Object[initVolume];
	}
	
	
	/**
	 * 将指定的元素加入容器
	 * @param s 要加入到容器中的元素
	 */
	public void add(E s){
		if(length==src.length){
		
			Object []dest =new Object[src.length+GrowthRate];

			//将原来数组中的数据按照下标顺序拷贝到新数组
//			for(int i=0;i<src.length;i++){
//				dest[i] = src[i];
//			}
			System.arraycopy(src, 0, dest, 0, length);
			//将src指向新数组
			src = dest;
			
		}
		src[length]=s;
		length++;
		
	}
	
	/**
	 * 获取指定下标位置的元素
	 * 
	 * @param index
	 *            要获取的元素的下标
	 * @return 返回获取到的元素
	 */
	public E get(int index){
		return (E)src[index];
	}
	
	/**
	 * 修改指定位置元素的值
	 * 
	 * @param index要修改的元素位置
	 * @param s
	 *            修改后的新元素
	 */
	public void update(int index, E s) {
		if(index>=0&&index<size()){
		src[index]=s;
		}else{
			System.out.println("更新操作指定下标超出范围,请更新从0-"+(src.length-1)+"的元素");
		}
	}
	
	/**
	 * 将指定元素插入到指定位置
	 * @param index 要插入元素的位置,第index个元素
	 * @param s 要插入的新元素
	 */
	public void insert(int index, E s) {
		if(index>=0&&index<length){
			Object[] dest;
			if(length>=src.length-1){//即将超出范围就需要增加容量
			dest =new Object[src.length+GrowthRate];
			
			}else{
				dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量
			}

				//将原来数组中的数据按照下标顺序拷贝到新数组
				System.arraycopy(src, 0, dest, 0, index);
				System.arraycopy(src, index, dest, index+1,src.length-index-1);
					
				//将src指向新数组
				src = dest;
			
			//将新加进的元素放入新数组的相应位置
			src[index]=s;
			length++;
				
	}
				
				else{
					System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");
				}
	}
	
	/**
	 * 移除指定位置的元素
	 * 
	 * @param index
	 *            要移除的元素的下标,0-src.length-1;
	 */
	public void remove(int index) {
		if(index>=0&&index<length){
			Object[] dest;
			if(length>=src.length-1){//即将超出范围就需要增加容量
			dest =new Object[src.length+GrowthRate];
			
			}else{
				dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量
			}

				//将原来数组中的数据按照下标顺序拷贝到新数组
				System.arraycopy(src, 0, dest, 0, index);
				System.arraycopy(src, index+1, dest, index,src.length-index-1);
					
				//将src指向新数组
				src = dest;

			length--;
				
	}
		else{
			System.out.println("删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");
		}
	}

	/**
	 * 获得容器中元素个数的方法
	 * 
	 * @return 返回元素的个数
	 */
	public int size() {
		return length;
	}
}

 

public class Demo {
	public static void main(String args[]){
		ArrayQueue<String> queue =new ArrayQueue();

		long t1=System.currentTimeMillis();	
		for(int i=0;i<1000000;i++){
			queue.add(""+i);
		}

		
		long t2=System.currentTimeMillis();	
		for(int i=0;i<queue.size();i++){
			System.out.println(queue.get(i));	
		}
		
		System.out.println(t2-t1);
		/**测试不同容量.增长比率对时间的影响
		 * this.initVolume=900000;
		 *this.GrowthRate=10000;
		 *t2-t1=891
		 *this.initVolume=9000;
		 *this.GrowthRate=100;
		 *t2-t1=7792
		 */

	}
	
}

 

分享到:
评论
2 楼 肆无忌惮_ 2014-05-18  
我不知道怎么回复...@金R在奋斗着
1 楼 金R在奋斗着 2014-05-18  
  你这是从啥时候就开始写了啊  好详细喔 

相关推荐

    ArrayList实现对产品CRUD

    在这个“ArrayList实现对产品CRUD”的项目中,我们将探讨如何利用面向对象编程(OOP)的思想来操作ArrayList,进行创建、读取、更新和删除(通常称为CRUD操作)产品对象。对于初学者来说,这是一个很好的实践案例,...

    android arraylist 实现 listview

    在这个场景中,我们将探讨如何利用ArrayList来实现ListView,以及如何添加编辑、新增、删除功能,以及在Activity间传递参数,同时还会涉及到ContextMenu和OptionsMenu的实现,以及长按事件的处理。 首先,我们需要...

    我的ArrayList实现

    《我的ArrayList实现》这篇博客主要探讨了如何在Java中自定义一个类似ArrayList的数据结构,并深入理解ArrayList的工作原理。ArrayList是Java集合框架中的一个重要组件,它是一个动态数组,提供了高效的元素添加、...

    Java ArrayList实现的快排,归并排序,堆排序

    本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)这三种经典的排序算法,并探讨它们的原理、优缺点以及在实际应用中的选择。 **快速排序(Quick Sort)**...

    用ArrayList实现用户信息的添加,删除,更新,查询

    以上就是使用ArrayList实现用户信息管理的基本操作。然而,对于大型项目或频繁的增删改查操作,可能需要考虑使用更高效的数据结构,如HashMap(基于键值对,查找速度更快)或数据库来进行数据管理。在实际应用中,...

    asp hashmap,arraylist实现

    标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。HashMap和ArrayList是.NET框架中常用的数据集合类,它们在处理和组织数据方面各...

    Java实训之利用Arraylist实现学生管理系统

    在这个实训项目中,“Java实训之利用ArrayList实现学生管理系统”旨在帮助初学者掌握ArrayList的基本操作,并将其应用于实际的管理系统中。 首先,我们需要了解ArrayList的基本特性。ArrayList是一个动态数组,它...

    深入Java集合学习系列(三):ArrayList实现原理

    Java集合框架中,ArrayList是一种常见的集合实现类,用于存储和操作对象集合。ArrayList基于动态数组的数据结构,因此它能够提供自动扩容的功能,同时也能够快速地进行随机访问。本篇文档将深入探讨ArrayList的内部...

    Java学生成绩管理系统实例(ArrayList)

    实现一个学生成绩管理的简单系统。要求可以添加、删除、修改、查询成绩 创建界面相关的接口:将菜单中显示的内容定义成若干字符串常量,放入一个接口Menu中以便使用 TestDemo(主类) import java.util.ArrayList; ...

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

    在这个ArrayList实现中,第一层散列可能是用来快速定位元素的位置,而第二层散列可能是为了处理散列冲突,确保每个元素都有一个唯一的索引。这种双层散列结构可以显著减少查找和插入的时间复杂度,使其接近O(1)。 ...

    用java自己实现的arrayList

    用java自己实现的arrayList,比较详细,有助于初学者理解arrayList的基本概念和基础用法

    自定义ArrayList实现

    自己写的ArrayList,请勿喷!

    用java实现的栈,通过使用ArrayList的方法

    此方法是通过java提供的ArrayList方法对栈的实现;

    Java员工管理系统,ArrayList存储

    本项目聚焦于使用Java编程语言实现一个基于ArrayList的员工管理系统。ArrayList是Java集合框架中的一种动态数组,它提供了方便的数据存储和操作功能,特别适合用于小型数据集的存储。 在Java中,ArrayList类位于`...

    JAVA运用ArrayList实现逻辑推理题(谁养鱼)

    使用JAVA语言中的ArrayList解决爱因斯坦在20世纪初出的逻辑推理题——《谁养鱼》,在一条街上有5座房子,喷了5种颜色。每个房子里住着不同国籍的人。每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。问谁养的...

    用自定的ArrayList实现队列

    队列的核心为先进先出,即先入队的元素先出队,在之前手写的ArrayList中添加了删除方法实现了队列 /** * 在之前自定义的动态数组基础上完成队列,动态数组中要添加删除方法 * * @author 大刘 */ public class ...

    JavaArrayList实现学生档案管理系统

    * 1-13-1学生档案管理 1.通过system. out提示信息,采田scanner录入学生信息,保存至集合。 2.查看全部学生信息。 3.按学生姓名查询该学生信息。 4.创建学生类,记录保存至集合。 5添加专业,按专业查询学生信息

Global site tag (gtag.js) - Google Analytics