数组(array)
- 数组是相同类型数据的有序集合
- 数组长度是固定的
- 数组可以是任何数据类型,包括基本类型和引用类型
- 数组对象本身是在堆中
- 数组的下标是从0开始的
- 数组小标必须要指定范围内使用否则报错(下标越界异常)
- 即 int[]arr=new int[5]; 其有效下标为0-4
- 数组属于引用类型时数组型数据是对象
数组声明和创建
定义:
int[]nums;//首选声明类型
int nums2[];//C语言风格
nums=new int[10];//创建一个数组
int [] num=new int [10];//创建与声明相结合
int [] numbers={10,20,30,40,50};//定义数组:
数组赋值机制(引用传递)
- 基本数据类型赋值(值拷贝)
int n1=10;
int n2=n1;
n2=80;
//输出n1为10;n2为80;
//n2的变化不会影响n1的值
- 数组引用传递(地址拷贝)
int[] arr1={1,2,3};
int[] arr2=arr1;
//赋的是一个地址,arr2的变化会影响到arr1
arr2[0]=10;
//输出的arr1为 10 2 3
数组长度
获取数组的长度:arrays.length
初始化
//静态初始化:
int[]a={1,2,3,4,5,6};
System.out.println(a[0]);
//动态初始化:包含默认初始化(一被分配空间后,没被赋值的都为0或NULL)
int[]b=new int[10];
b[0]=10;
数组边界
下标的合法区间:[0,length-1]
如果越界就会报错:ArrayIndexOutOfBoundException:数组下标越界异常
数组使用
int[]arrays={1,2,3,4,5};
//打印所有数组元素
for(int i=0;i<arrays.length;i++){
System.out.println(arrays[i]);
}
//计算所有元素的和
int sum=0;
for(int i=0;i<arrays.length;i++){
sum+=array[i];
}
//查找最大的元素
int max=array[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>max){
max=arrays[i];}
}
//反转数组
int[]result=new int[arrays.length];
for (int i = 0,j=result.length-1; i <arrays.length ; i++,j--) {
result[j]=arrays[i];
}
return result;
输入arrays.for 即可自动生成增强型for循环
for(int array:arrays){
System.out.println(arrays);
//没有下标
}
多维数组
- 多维数组可以看成是数组的数组
- 以二维数组为例子
- 定义形式上看 int[][]
- arr[i]表示二维数组的第i+1个元素 eg: arr[0]为二维数组第一个元素
- arr[i].length 得到对应的每个一维数组的长度
- 访问第(i+1)个一维数组的第j+1个值 arr[i][j]
//二维数组的定义:
int[][]arrays={{1,2}{2,3}{3,4}};
//三行两列的数组,arrays[0][0]为1,arrays[1][1]为3
// 1,2
// 2,3
// 3,4
//此时打印的数组长度为3,即外面空间有三个元素
工具类Arrays
避免重复造轮子,有工具就不用自己再打一遍。
常用功能:
- 给数组赋值:fill
- 输出数组:toString
- 对数组排序:sort
- 比较数组:equals
- 查找数组元素:binarySearch
int []a={1,3,23,5235,2432,4234};
//打印数组元素:Arrays.toString
System.out.println(Arrays.toString(a));
//结果为[1, 3, 23, 5235, 2432, 4234]
//排序算法:
Arrays.sort(a);//升序
//之后再打印的结果为[1, 3, 23, 2432, 4234, 5235]
//数组填充
Arrays.fill(a,0);//全填为0
//之后打印结果为[0, 0, 0, 0, 0, 0]
Arrays.fill(a,1,3,0);//下标1到下标3的值之间填为0
//之后打印结果为[1, 0, 0, 5235, 2432, 4234]、
稀疏数组
一种数据结构,一个二维数组很多元素是默认值为0或者为同一值。
处理方式:
- 记录数组几行几列,有多少个不同值
- 吧具有不同值的元素和行列及值记录在一个小规模数组中从而缩小程序规模
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LrSLDWwf-1643082260302)(assets/稀疏数组.jpg)]
//创建一个二维数组11*11 0:没有棋子,1:黑棋,2:白棋
int[][]array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
System.out.println("输出原始的数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
//输出结果为:
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 1 0 0 0 0 0 0 0 0
// 0 0 0 2 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0
}
//转换为稀疏数组保存
//获取有效值的个数
int sum=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//创建一个稀疏数组的数组
int[][]array2=new int [sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组array1,将非零的值存放稀疏数组中
int count=0;
for(int i=0;i< array1.length;i++){
for(int j=0;j<array1[i].length;j++){
if(array1[i][j]!=0){
count++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for(int i=0;i<array2.length;i++){
System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]+"\t");
}
//稀疏数组:
// 11 11 2
// 1 2 1
// 2 3 2
//给出稀疏数组还原原数组:
//1、读取稀疏数组
int[][]array3=new int[array2[0][0]][array2[0][1]];
//2、给其中的元素还原他的值
for(int i=1;i<array2.length;i++){
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
//3、打印
for (int[] ints : array3 ){
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//输出结果为
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
}