用到的知识:
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 */ } }
相关推荐
在这个“ArrayList实现对产品CRUD”的项目中,我们将探讨如何利用面向对象编程(OOP)的思想来操作ArrayList,进行创建、读取、更新和删除(通常称为CRUD操作)产品对象。对于初学者来说,这是一个很好的实践案例,...
在这个场景中,我们将探讨如何利用ArrayList来实现ListView,以及如何添加编辑、新增、删除功能,以及在Activity间传递参数,同时还会涉及到ContextMenu和OptionsMenu的实现,以及长按事件的处理。 首先,我们需要...
《我的ArrayList实现》这篇博客主要探讨了如何在Java中自定义一个类似ArrayList的数据结构,并深入理解ArrayList的工作原理。ArrayList是Java集合框架中的一个重要组件,它是一个动态数组,提供了高效的元素添加、...
本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)这三种经典的排序算法,并探讨它们的原理、优缺点以及在实际应用中的选择。 **快速排序(Quick Sort)**...
以上就是使用ArrayList实现用户信息管理的基本操作。然而,对于大型项目或频繁的增删改查操作,可能需要考虑使用更高效的数据结构,如HashMap(基于键值对,查找速度更快)或数据库来进行数据管理。在实际应用中,...
标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。HashMap和ArrayList是.NET框架中常用的数据集合类,它们在处理和组织数据方面各...
在这个实训项目中,“Java实训之利用ArrayList实现学生管理系统”旨在帮助初学者掌握ArrayList的基本操作,并将其应用于实际的管理系统中。 首先,我们需要了解ArrayList的基本特性。ArrayList是一个动态数组,它...
Java集合框架中,ArrayList是一种常见的集合实现类,用于存储和操作对象集合。ArrayList基于动态数组的数据结构,因此它能够提供自动扩容的功能,同时也能够快速地进行随机访问。本篇文档将深入探讨ArrayList的内部...
实现一个学生成绩管理的简单系统。要求可以添加、删除、修改、查询成绩 创建界面相关的接口:将菜单中显示的内容定义成若干字符串常量,放入一个接口Menu中以便使用 TestDemo(主类) import java.util.ArrayList; ...
在这个ArrayList实现中,第一层散列可能是用来快速定位元素的位置,而第二层散列可能是为了处理散列冲突,确保每个元素都有一个唯一的索引。这种双层散列结构可以显著减少查找和插入的时间复杂度,使其接近O(1)。 ...
用java自己实现的arrayList,比较详细,有助于初学者理解arrayList的基本概念和基础用法
自己写的ArrayList,请勿喷!
此方法是通过java提供的ArrayList方法对栈的实现;
本项目聚焦于使用Java编程语言实现一个基于ArrayList的员工管理系统。ArrayList是Java集合框架中的一种动态数组,它提供了方便的数据存储和操作功能,特别适合用于小型数据集的存储。 在Java中,ArrayList类位于`...
使用JAVA语言中的ArrayList解决爱因斯坦在20世纪初出的逻辑推理题——《谁养鱼》,在一条街上有5座房子,喷了5种颜色。每个房子里住着不同国籍的人。每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。问谁养的...
队列的核心为先进先出,即先入队的元素先出队,在之前手写的ArrayList中添加了删除方法实现了队列 /** * 在之前自定义的动态数组基础上完成队列,动态数组中要添加删除方法 * * @author 大刘 */ public class ...
* 1-13-1学生档案管理 1.通过system. out提示信息,采田scanner录入学生信息,保存至集合。 2.查看全部学生信息。 3.按学生姓名查询该学生信息。 4.创建学生类,记录保存至集合。 5添加专业,按专业查询学生信息