基于Java实现动态数组

动态数组的基本原理

实现一个基本的动态数组,需要实现一些基本的功能,增删改查应该是最基本的了,而在此基础之上还需要实现相应的动态扩容与泛型。对于动态扩容来说,我们需要在数组的使用过程中来进行判断,是否需要进行扩容,以及如何更有效的进行扩容,添加长度还是重新申请。而泛型的实现就需要数组能够接受任何类型的数据。

动态扩容

实现动态扩容的方式有很多,但是在数组的后面接上一段内存是明显不行的,我们需要做的就是重新申请一个更大容量的数组,这样才是可行的方法,但是问题又来了用什么方式来申请才能够最有效的扩容,我们不应该需要一个然后扩容一个(在扩容的时候我们还需要把旧数组中的数据转移到新数组中去)如果这样做的话会非常浪费性能和消耗时间的;所以我们选择扩容的时候让容量乘以一个特定的数,让其能够成倍数增长,这样我们就不需要频繁的去重新生成数组来扩容,当然也不会因为初始开辟的内存过大而浪费内存(这一点和java的实现方式是差不多),所以我们使用成倍数增长的方式来实现动态扩容。

泛型

泛型(E)也就是可以匹配任何类型,对于这一点java其实可以实现的很简单,原因就是java的所有类都会继承一个java.lang包中一个类就是Object类,所有的类都会默认继承这个Object类,因此我们只需要将泛型定义为Object类型就可以了。
但是泛型又会牵扯到一个java的自动装箱和自动拆箱的功能,Java为每种基本数据类型都提供了对应的包装器类型(int就是对应Integer,自动装箱:生成一个的10的integer对象只需要Integer i= 10,而不需要new Integer(10),反之拆箱就是直接把Integer对象的值赋值给int类型,而不需要类型装换),装箱:自动将基本数据类型转换为包装器类型;拆箱:就是自动将包装器类型转换为基本数据类型;而对于数组输入值进行查找的时候会有类型检索和拆装箱的操作所以会有一点性能损失,而这也造成了ArrayList是一个类型不安全的数组(当然是想对言的)

动态数组的基本实现

动态数组的基本结构

  • 模拟动态数组的接口设计实现
  • int size() // 数组元素的个数
  • boolean isEmpty() // 判断数组是否为空
  • boolean contain(E e) // 判断数组中是否含有该数据项
  • E get(int index) // 返回对应位置的数组元素
  • E set(int index, E e)// 设置相应索引位置的元素的值,并且返回原来的元素的值
  • void add(E e) // 往数组的末尾添加元素,超长则扩容
  • void add(int index, E e)// 往相应的索引位置添加于元素,后面的数组元素后移一位
  • E remove(int index) // 删除指定位置的元素,后续数据全部前移一位
  • int indexOf(E e) // 获取某个元素在数组中的位置
  • void clear() // 清空数组
  • void check() //检查数组索引是否越界
  • void capacity() // 判断是否需要扩容

初始化数组ArrayList

初始化数组可以把一些不需要改变的量设置为常量,比如初始数组容量,并设定好相应的全局变量。初始化数组函数一般会提供两个,一个是空参构造器一个是含参构造器(含参构造器可以由用户决定初始化数组容量的大小)。

public class ArrayList<E> {
   	// 这里E代表泛型
	private int size = 0;	// 我们初始化定义数组的内部元素个数为0
	private E[] elements;	// 声明一个数组变量
	private static final int NUM = 5; // 我们把常量定义为静态变量,这样他就只会占用一次内存
	
	/**
	 * 空参构造器,默认定义数组的容量为10个元素
	 */
	public ArrayList() {
   
//		elements = new E[num]; //可以直接定义,也可以调用含参构造器来实现
		this(NUM);
	}
	
	/**
	 * 含参构造器,通过num参数传递数组容量
	 * @param num
	 */
	public ArrayList(int num) {
   
		// 这里需要对传入的参数进行判断,防止出现负数的情况
		num = (num < NUM) ? NUM : num;
		elements = (E[]) new Object[num];
	}

返回数组元素个数Size()与判空

数组元素个数初始为0,随后的更新数组操作都会同步的更新size变量的值,所以直接返回size变量即可。判空的话就直接判断size是否为0就行。

	/**
	 * 获取数组的元素个数
	 * @return
	 */
	public int size() {
   
		return size;
	}
	/**
	 * 判断动态数组是否为空
	 * @return
	 */
	public 
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值