基于面向对象,模拟ArrayList的实现(只包括int)

大家好,我是kai_childe,本期为大家带来模拟ArrayList在int型上的实现方法。


功能要求

数组中只能存储int类型数据
提供一个初始数组长度为10的构造器,以及一个默认无参构造器
提供一个能够向数组中添加元素的方法
当数组容量超出时要求能自动扩容,扩充为元素组的1.5倍
提供一个能够返回数组真实长度的方法
提供一个能够返回指定位置元素的方法


一、基本思路

本题的难点主要是当原数组存满时如何实现数组的扩容,下面进行简单分析:

当向数组中存储数据时,先判断数组是否已满,如果已满,则创建一个新的数组,长度为原数组的1.5倍,再将原数组数据利用System.arraycopy()方法复制到新数组中,最后再用新数组将原数组覆盖,这样就达到了扩容的目的。

二、实现过程

1.创建MyArrayList

代码如下:

public class MyArrayList {
	
	/**初始值为空的int型数组*/
	private int[] arr= {};
	
	/**定义变量a,用于记录数组索引*/
	private int a=0;
	
	/**无参构造器,用于在创建MyArrayList对象时,初始化长度为10的arr数组
	 * this(10):调用向有参构造器传值*/
	public MyArrayList() {
		this(10);
	}

	/**有参构造器,创建MyArrayList对象时,初始化arr数组长度。*/
	public MyArrayList(int capacity) {
		arr = new int[capacity];
	}
	
	/**set方法,用于给arr赋值*/
	public void setArr(int[] arr) {
		this.arr = arr;
	}

2.编写数组扩容方法dilatation()

代码如下:

/**获取原数组长度,并进行扩容*/
	public void dilatation(int i) {
		//">>"右移运算,i>>1 =  i/2
		//将新数组的长度定义为原数组长度的1.5倍
		int[] arr=new int[(i>>1)+i];
		//arraycopy():将一个数组复制到另一个数组中去。
		//arraycopy()中有五个参数分别为
		//(源数组,源数组的起始位置,目标数组,目标数组的起始位置,复制长度)。
		System.arraycopy(this.arr, 0, arr, 0, this.arr.length);
		//将已经扩容的数组利用setArr方法传递给全局数组arr。
		setArr(arr);
	}

3.编写向数组添加元素的方法add()

代码如下:

/**向数组中存值*/
	public void add(int i) {
		//用数组索引和数组长度进行比较判断数组是否存满
		if(a<arr.length) {
			//未存满则将数据存入数组
			arr[a]=i;
			//索引加一
			a++;
		}else {
			//存满则调用数组扩容方法dilatation(),将数组长度扩容为1.5倍
			dilatation(arr.length);
			//然后再将数据存入数组
			arr[a]=i;
			//索引加一
			a++;
		}	
	}

3.编写返回数组长度的方法 size()1、size()2和返回指定位置元素的方法 get(int index)

代码如下:

//返回数组当前的实际长度(数据长度,不是数组长度)
	public int size() {
		return a;
	}
	
//返回数组的长度
	public int size2() {
		return arr.length;
	}
	
	//返回返回指定位置的元素
	public int get(int index) {
		return arr[index-1];
	}

4.全部代码

代码如下:

public class MyArrayList {
	
	/**初始值为空的int型数组*/
	private int[] arr= {};
	
	/**定义变量a,用于记录数组索引*/
	private int a=0;
	
	/**无参构造器,用于在创建MyArrayList对象时,初始化长度为10的arr数组
	 * this(10):调用向有参构造器传值*/
	public MyArrayList() {
		this(10);
	}

	/**有参构造器,创建MyArrayList对象时,初始化arr数组长度。*/
	public MyArrayList(int capacity) {
		arr = new int[capacity];
	}
	
	/**set方法,用于给arr赋值*/
	public void setArr(int[] arr) {
		this.arr = arr;
	}
	
	/**获取原数组长度,并进行扩容*/
	public void dilatation(int i) {
		//">>"右移运算,i>>1 =  i/2
		//将新数组的长度定义为原数组长度的1.5倍
		int[] arr=new int[(i>>1)+i];
		//arraycopy():将一个数组复制到另一个数组中去。
		//arraycopy()中有五个参数分别为
		//(源数组,源数组的起始位置,目标数组,目标数组的起始位置,复制长度)。
		System.arraycopy(this.arr, 0, arr, 0, this.arr.length);
		//将已经扩容的数组利用setArr方法传递给全局数组arr。
		setArr(arr);
	}
	
	/**向数组中存值*/
	public void add(int i) {
		//用数组索引和数组长度进行比较判断数组是否存满
		if(a<arr.length) {
			//未存满则将数据存入数组
			arr[a]=i;
			//索引加一
			a++;
		}else {
			//存满则调用数组扩容方法dilatation(),将数组长度扩容为1.5倍
			dilatation(arr.length);
			//然后再将数据存入数组
			arr[a]=i;
			//索引加以
			a++;
		}	
	}
	
	//返回数组当前的实际长度(数据长度,不是数组长度)
	public int size() {
		return a;
	}
	
	//返回数组的长度
	public int size2() {
		return arr.length;
	}
	
	//返回返回指定位置的元素
	public int get(int index) {
		return arr[index-1];
	}
	
}

5.测试

代码如下:

public class Tese {
	public static void main(String[] args) {
		// 生成MyArrayList 对象
		MyArrayList myArrayList = new MyArrayList();

		// 在不赋值的情况下查看数组的真实长度和数组长度
		System.out.println("不赋值的情况下数组真实长度:" + myArrayList.size1());
		System.out.println("不赋值的情况下数组长度:" + myArrayList.size2());

		// 向数组传值,先传10个值
		myArrayList.add(11);
		myArrayList.add(22);
		myArrayList.add(33);
		myArrayList.add(44);
		myArrayList.add(55);
		myArrayList.add(66);
		myArrayList.add(77);
		myArrayList.add(88);
		myArrayList.add(99);
		myArrayList.add(100);

		// 传10个值的情况下查看数组的真实长度和数组长度
		System.out.println("===============================================");
		System.out.println("传10个值的情况下数组真实长度:" + myArrayList.size1());
		System.out.println("传10个值的情况下数组长度:" + myArrayList.size2());
		System.out.println("查看数组中第5个值:" + myArrayList.get(5));

		// 接着向数组传值,看数组是否自动扩容
		myArrayList.add(105);
		myArrayList.add(156);
		myArrayList.add(189);
		// 传13个值的情况下查看数组的真实长度和数组长度
		System.out.println("===============================================");
		System.out.println("传13个值的情况下数组真实长度:" + myArrayList.size1());
		System.out.println("传13个值的情况下数组长度:" + myArrayList.size2());
		System.out.println("查看数组中第12个值:" + myArrayList.get(12));

		// 接着向数组传值,看数组是否继续自动扩容
		myArrayList.add(255);
		myArrayList.add(366);
		myArrayList.add(587);
		// 传16个值的情况下查看数组的真实长度和数组长度
		System.out.println("===============================================");
		System.out.println("传16个值的情况下数组真实长度:" + myArrayList.size1());
		System.out.println("传16个值的情况下数组长度:" + myArrayList.size2());
		System.out.println("查看数组中第16个值:" + myArrayList.get(16));
	}

}

:测试结果
在这里插入图片描述

总结

本文运用面向对象的思想和基于arraycopy()方法成功模拟实现了ArrayList在int型数组上自动扩容的功能。达到了在逻辑上获取长度动态变化的数组的目的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArrayListJava中内置的动态数组,它能够自动调整大小以适应存储的数据量。在程序设计二的实训10中,要求我们实现一个复杂,而这个使用ArrayList来存储数据。 实现ArrayList需要考虑以下几个方面: 1. 封装内部数组:我们需要在中创建一个私有的数组来存储数据。为了保证封装性,这个数组应该是私有的,只能通过的方法来访问和修改。 2. 动态调整数组大小:由于ArrayList需要能够动态调整大小,我们需要在中添加方法来检查数组是否已满,如果已满则创建一个更大的数组并将原有数据复制到新数组中。 3. 添加元素:为了方便使用,我们需要在中添加方法来向数组中添加元素。在添加元素时,我们需要检查数组是否已满,如果已满则先调整数组大小后再添加元素。 4. 删除元素:同样地,我们需要在中添加方法来删除数组中的元素。删除元素时,我们需要将后续的元素依次向前移动,并更新数组的大小。 5. 获取元素:为了方便使用,我们还需要在中添加方法来获取数组中的元素。可以根据下标来获取指定位置的元素。 6. 其他方法:除了上述基本操作外,还可以根据需要添加其他方法,比如获取数组的大小、判断数组是否为空等。 总之,实现ArrayList需要我们对动态数组的特性及其操作有较深入的理解。通过封装内部数组、动态调整数组大小以及实现基本的增删查操作,我们可以完成ArrayList实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值