目录
一、数组核心概念
1.数组是什么?
2.数组优点
3.数组缺点
4.数组用处
二、封装一个自定义数组类MyList
1.数组属性定义
2.数组初始化方法
3.数组扩容方法
4.增加元素方法
5.删除元素方法
6.替换元素方法
7.元素排序方法
8.数组合并方法
9.获取元素方法
数组是内存中用来存储数据的一段连续固定长度空间,有长度、存储数据容量、下标等属性。
a、数组能存储大量数据,我们可以按照索引遍历数组中的元素。
b、数组是一个简单的线性序列,我们可以按照索引对数组中的元素进行增、删、查、取等操作。
c、由于我们可以通过下标对数组元素进行一次性操作,所以数组的时间复杂度为O1。
a、数组的长度固定,其大小一经确定就不能改变。
b、数组相对于链表,其插入元素、增删元素、查找元素慢。
c、数组不好管理。
在进行模型设计、已知数据量规模或用来临时存储少量数据时可以使用数组,简化算法。
数组存储数据的结构(数组类型为Object(所有类的父类))、长度、已存储数据量、下标。
Object[] valueArray={};//数组初始化时最好加上{}防止报空指针错误 int length; int size; int index; int defaultlength=10;//默认长度
public void initArray() { length=defaultlength; valueArray=new Object[length]; size=0; index=0; } public MyList(){ initArray(); }
在数组已满的情况下,往数组中增加元素会出现越界错误。此时需要对数组进行扩容,创建一个更大容量的数组,将原数组中的数据遍历复制过去。再通过对象名赋值,将使用的数组替换为这个新创建的数组 。
public void grow() { System.out.println("扩容前:"+length); int newlength=length*2; length=newlength;//容量更改 Object[] newArray=new Object[length];//定义新数组 //循环遍历 将原数组元素值赋值到扩容数组中 实现copy操作 for(int i=0;i<valueArray.length;i++) { newArray[i]=valueArray[i]; } //替换引用 valueArray=newArray; System.out.println("扩容后:"+length); }
增加数据时考虑容量有限,对数组进行扩容操作。
public void add(Object value) { if(size>=length) {//判断是否跨界 跨界则对数组进行扩容 grow(); } valueArray[index]=value; size++; index++; }
删除元素时同样需要考虑是否越界,然后根据索引值删除元素,删除元素后后面元素的索引值往前移。
//数组减元素方法 根据索引值删除元素 后面元素的索引值往前移 同样考虑是否越界 public void delete(int index) { if(index<0||index>=size){ System.out.println("输入索引错误:越界"); }else if(index==size-1){//删除最后一个元素 后面无元素补上其位置 所以将其设置为空值null valueArray[index]=null; }else {//删除中间元素 后面元素补上已删元素的位置 valueArray[index]=valueArray[index+1]; } size--; }
public void swap(int index,Object value) { if(index<0||index>this.length){ System.out.println("输入索引错误:越界"); }else { valueArray[index]=value; } }
采用冒泡排序法,比较数组中相邻元素,如果前面元素小于后面元素,那么将两个元素位置互换,使元素按从大到小进行排列。
//排序 从大到小进行排序(Object类型如何转换成int类型进行比较?) public void sort(){ //对数组进行遍历 定义数组比较的两个元素 for(int i=0;i<valueArray.length-1;i++) {//第一个元素从数组第一个元素取至数组倒数第二个元素 for(int j=i+1;j<valueArray.length;j++) {//第二个元素从第一个元素后一个元素取至数组最后一个元素 if(((Integer)valueArray[i])<((Integer)valueArray[j])){//强制转换成int类型进行比较 int temp=(Integer)valueArray[i];//现将大的放至空容器中 valueArray[i]=(Integer)valueArray[j];//原大的赋值给原小的 valueArray[j]=temp;//完成交换 } } } }
//合并其他数组或者队列对象 public void merge() { int[] valueArray0= {20,30,40,50,60,70,80}; if(size>=length) { grow(); } for(int inx=0;inx<valueArray0.length;inx++) { add(valueArray0[inx]);//调用前已构造的add方法 } }
通过下标获取元素
public Object get(int index) { if(index>=0&&index<this.index) { return valueArray[index]; }else { System.out.println("输入下标错误:越界"); } return null;//报错 }