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