数组
定义
数组可以看作一个容器,它存储的是相同数据类型的数据;也就是存储连续内存空间的集合;它是最基本的数据结构。
数组分类
数组分为一维,二维和多维,这里主要介绍一维和二维
数组声明
- 一维数组
- 静态声明
int[] arr1= {1,2,3};
byte[] arr2= {2,2,3,4};
boolean[] arr3= {true,false,true};
char[] arr4= {'a','b','4'};
System.out.println(arr1.length);
System.out.println(arr2.length);
System.out.println(arr3.length);
System.out.println(arr4.length);
- 动态声明
语法结构 : 数据类型[] 变量名 = new 数据类型[长度];
// 动态声明
int[] arr5 =new int[5];
System.out.println(arr5.length);
// [] 也可以放在变量名后面,但是不建议这样写
// int arr6[] = {1,2,2,2,1};
}
- 二维数组
- 静态声明
// 静态二维数组
int[][] a= {
{1,2,3,4,5},
{11,12,13,14,15},
{21,22,23},
{31,45}
};
- 动态声明
// 动态二维数组
// 同理第一个中括号内是二维内一维数组个数 而二个括号内是一维数组内数值个数,
int[][] b=new int[3][3];
// 第二个中括号可以不填,如果一维数组内个数都不同,单独定义,而可以填一个大多数的,定义更改那少数
b[1]=new int[2];
int[][] c=new int[3][];
c[0]= new int[5];
c[1]=new int[4];
c[2]=new int[6];
注意: 动态声明刚申明的时候是有默认值占着位置的
*整数 0
*小数 0.0
*布尔 false
*字符 \u0000
*引用 null
操作与遍历
查询与更改
- 一维数组
/*
* 下标从0开始
* length属性是数组的长度
*/
public static void main(String[] args) {
int[] arr1 = {88,97,322131233};
// 第一个元素 默认重0开始
// 查询
System.out.println(arr1[0]);
System.out.println(arr1[1]);
// 更改
arr1[0] =98;
System.out.println(arr1[0]);
// 就相当于查询数组中最后一个数
System.out.println(arr1[arr1.length-1]);
// 超出数组个数上限 下标异常 java.lang.ArrayIndexOutOfBoundsException: 3
// System.out.println(arr1[3]);
System.out.println("-------------------");
- 二维数组
//取第一个数组的第一个
int[] a1=a[0];
int a2=a1[0];
System.out.println(a2);
//等价于
System.out.println(a[0][0]);
遍历
- 一维数组
// 遍历 普通for循环
for(int i=0;i < arr1.length;i++) {
System.out.println(arr1[i]);
}
System.out.println("-------------------");
// 遍历 增强for循环 for(该数组的数据类型 符合类型的变量:数组名)
for (int i:arr1) {
System.out.println(i);
}
- 二维数组
int[][] b=new int[3][3];
// 加强for循环
for ( int[] i: b) {
for(int j:i) {
System.out.print(j+" ");
}
System.out.println();
}
数组复制
System类中提供了一个复制数组的方法 arraycopy
结构: arraycopy(原数组名,原数组起始下标,目标数组名,目标起始下标,复制个数)
注意: arraycopy的起始位置下标是包含关系
一个复制直接到另一个中(替换复制):
// 定义两个数组 src原数组 dest目标数组
int[] src= {1,2,3,4,5,6};
int[] dest= {11,12,13,14,15,16};
// system类中提供的方法
// System.arraycopy(src, 2, dest, 3, 2);
arraycopy(src, 2, dest, 3, 2);
for(int i:dest) {
System.out.println(i);
}
}
两个数组合并(插入复制)
// 2 确定两个操作数组
int[] src= {1,2,3,4,5,6,7,8,9};
int[] dest= {11,12,13,14,15,16,17,18,19};
// 调用
int[] newDest = arraycopy(src, 2, dest, 8, 3);
for (int i : newDest) {
System.out.print(i+",");
}
}
// 1 先确定一个方法 用于调用
public static int[] arraycopy(int[] src, int srcPos, int[] dest,int destPos, int length) {
// 3 声明第三个数组,也是用来返回的
int[] newDest=new int[dest.length+length];
// 4 目标数组插入下标前的 复制到newdest
for(int i=0;i<=destPos;i++) {
newDest[i]=dest[i];
}
// 5 原数组需要复制数据复制到newdest后面
//
int a=destPos;
for(int i=1;i<=length;i++) {
a++;
newDest[a]=src[srcPos];
srcPos++;
}
// 6 目标数组插入之后剩下的数插入newdest
for(int i=destPos+1;i<dest.length;i++) {
a++;
newDest[a]=dest[i];
}
return newDest;
}