大家好,我是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型数组上自动扩容的功能。达到了在逻辑上获取长度动态变化的数组的目的。