动态数组的实现案例

简介: Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是List。下面介绍一下List作为Java动态数组的用法。 我们可以首先编写两个类List.java  和一个测试类Test1.java。将主类和测试类分开写,更有利于扩展性,这是一个非常好的编程思想。下面来看一下我们如何来实现List类。注释已经写得很清楚了,如果有不懂的地方欢迎留言。 //定义一个容器类p

Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是List。下面介绍一下List作为Java动态数组的用法。

我们可以首先编写两个类List.java  和一个测试类Test1.java。将主类和测试类分开写,更有利于扩展性,这是一个非常好的编程思想。下面来看一下我们如何来实现List类。注释已经写得很清楚了,如果有不懂的地方欢迎留言。

//定义一个容器类
public class List{
	final int INIT_LENGTH=10;
	int[] array=new int[INIT_LENGTH];
	int index=-1;

	int add(int [] newArray){
		int temp=index;
		if(newArray==null){
			System.out.println("数组不能为空");
			return -1;
		}

	if(index+1+newArray.length>array.length){
		int newlength=(index+1+newArray.length)*2;
		expand(newlength);
	}
	System.arraycopy(newArray,0,array,index+1,newArray.length);
	index=index+newArray.length;
	return temp+1;
	}

	//方法的重载
	void expand(int newlength){
		//新创建一个数组,这个新数组的长度两倍大
		int[] x=new int[newlength];
		//复制array中的数据到x中
		System.arraycopy(array,0,x,0,array.length);
		array=x;
	}

	void expand(){
		//新创建一个数组,这个新数组的长度两倍大
		int[] x=new int[array.length*2];
		//复制array中的数据到x中
		System.arraycopy(array,0,x,0,array.length);
		array=x;
	}

	//输出指定位置的元素
	int remove(int i){
		//判断i是否存在
		if(i>=0&&i<index){
			System.arraycopy(array,i+1,array,i,index-i);
			index--;
		}else{
			System.out.println("集合中没有这个索引"+i);
			return -1;
		}
		return -1;
	}


	//添加元素到指定位置
	//value:要添加的值
	//i:添加到数组的位置
	//返回值:添加元素的索引
	int add(int value,int i){
		if(i<0||i>index+1){
			System.out.println("索引越界"+i);
			return -1;
		}
	if(index>=array.length-1){
		expand();
	}

	index++;
	System.arraycopy(array,i,array,i+1,index-i);
	array[i]=value;
	return i;

	}
	//清空
	void clear(){
		array=new int[INIT_LENGTH];
		index=-1;
	}

	//求出容器的真实大小
	int size(){
		return index+1;
	}

	void add(int value){
		if( index>=array.length-1){
			expand();

		}
		index++;
		array[index]=value;
	}

	int[] getArray(){

		//新创建一个数组
		int[] result=new int[index+1];

		System.arraycopy(array,0,result,0,index+1);
		return result;
	}
}

接下来,我们把测试类写好。

public class Test1{
	public static void main(String[] args){
		List list=new List();
		int[] r=list.getArray();
		for(int t:r){
			System.out.println(t);
		}

	//开始存元素
	list.add(1);
	list.add(2);
	r=list.getArray();
	for(int t:r){
		System.out.println(t);
	}

	System.out.println("list容器中有"+list.size());
	for(int i=0;i<10;i++){
		list.add(i);
	}
	//存完后
	r=list.getArray();

	for(int t:r){
		System.out.println(t);
	}
	System.out.println("list容器中有"+list.size());
	System.out.println("清空===================");
	list.clear();
	System.out.println("清空后,list容器中有"+list.size());

	System.out.println("移除===================");
	for(int i=0;i<10;i++){
		list.add(i);
	}
	list.remove(3);
	r=list.getArray();

	for(int t:r){
		System.out.println(t);
	}
	System.out.println("在指定位置添加元素");
	list.add(888,1000);
	r=list.getArray();
}
}
然后呢,我们使用javac Test1.java     

java Test1

就可以顺利编译运行了。


目录
相关文章
|
6月前
|
存储 C语言
函数指针数组:更高效的代码实现方式——指针进阶(二)
函数指针数组:更高效的代码实现方式——指针进阶(二)
27 0
|
6月前
20 如何使用数组使用栈和队列
如何使用数组使用栈和队列
44 1
|
8月前
|
程序员 C++
7.1 C/C++ 实现动态数组
动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在不浪费空间的情况下根据需要动态增加或减少存储空间。
43 0
|
8月前
|
存储 设计模式 算法
数据结构之第四章、ArrayList和顺序表
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:【说明】ArrayList是以泛型方式实现的,使用时必须要先实例化ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问ArrayList实现了Cloneable接口,表明ArrayList是可以clone的ArrayList实现了Serializable接口,表明ArrayList是支持序列化的和Vector不同,
29 0
|
9月前
|
C++
C++数据结构--01数组二次封装成动态数组 2021-04-23
C++数据结构--01数组二次封装成动态数组 2021-04-23
|
9月前
|
存储 人工智能 编译器
动态数组进阶
动态数组进阶
|
9月前
CPP2022-22-数组进阶-动态数组(上)
CPP2022-22-数组进阶-动态数组
28 0
|
9月前
|
人工智能
CPP2022-22-数组进阶-动态数组(下)
CPP2022-22-数组进阶-动态数组
137 0
C动态数组
C动态数组
71 0
C动态数组
|
人工智能 C语言 C++
啪啪啪:动态数组|学习笔记
快速学习啪啪啪:动态数组
42 0