数组
一维数组
数组类似于一个柜子,柜子有一些带编号的抽屉,可以存储东西,抽屉的编号从0开始依次增加。
1.1定义
//-------定义-------
//与定义变量类似,和C++略有不同;
public class Main {
public static void main(String[] args) {
int[] a = new int[10];//创建一个名字叫a的柜子,柜子有10个抽屉,编号从0~9,只能往里面放整数;
float[] f = new float[33];//创建一个名字叫f的柜子,柜子有33个抽屉,编号从0~32,只能往里面放浮点数;
double[] d = new double[123];//创建一个名字叫d的柜子,柜子有123个抽屉,编号从0~122,只能往里面放double;
char[] c = new char[21];//创建一个名字叫c的柜子,柜子有21个抽屉,编号从0~20,只能往里面放字符;
}
}
1.2初始化
//初始化
public class Main {
public static void main(String[] args) {
int[] a = {0, 1, 2}; // 含有3个元素的数组,元素分别是0, 1, 2,等效于C++里的a[] = {0 , 1 , 2};
int[] b = new int[3]; // 含有3个元素的数组,元素的值均为0,等效于C++里的b[3] = 0;
char[] d = {'a', 'b', 'c'}; // 字符数组的初始化,等效于C++里的d[] = {'a' , 'b' , 'c'};
}
}
1.3访问数组元素
数组是默认由下标0开始从前往后灌入;
public class Main {
public static void main(String[] args) {
int[] a = {0, 1, 2}; // 数组下标从0开始
System.out.printf("%d %d %d\n", a[0], a[1], a[2]);
a[0] = 5;
System.out.println(a[0]);
}
}
2.多维数组
本质上多维数组就是数组的数组
二维数组可以形象地理解为行列,例如:a[i][j]可以理解为一个在第i行第j列的元素;
同样,三维数组可以理解为立体空间,例如:a[i][j][k]可以理解为在x = i , y = j , z = k的直角坐标系空间里的一个点;
public class Main {
public static void main(String[] args) {
int[][] a = new int[3][4];
// 大小为3的数组,每个元素是含有4个整数的数组。
//可以理解为一个平面直角坐标系,x在[0 , 3]的自然数,y为[0 , 4]的自然数坐标
int[][][] b = new int[10][20][30]; // 将所有元素的初值为0
// 大小为10的数组,它的每个元素是含有20个数组的数组,而这些数组的元素又是含有30个整数的数组
// 空间直角坐标系中,x在[0 , 10] , y在[0 , 20],z在[0 , 30]之间的自然数坐标;
}
}
可以测一下下面的结果试试;
public class Main {
public static void main(String[] args) {
int[][] a = {
{0, 1, 2, 3}, // 第1行的初始值
{4, 5, 6, 7}, // 第2行的初始值
{8, 9, 10, 11} // 第3行的初始值
};
for (int i = 0; i < 4; i ++ ) // 将第一行全部变成0
a[0][i] = 0;
for (int i = 0; i < 3; i ++ ) { // 输出二维数组
for (int j = 0; j < 4; j ++ ) {
System.out.printf("%d ", a[i][j]);
}
System.out.println();
}
}
}
3.数组的范围遍历
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[][] a = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
};
for (int[] row: a) { // 范围遍历,相当于for(int i = 0 ; i < a.length ; i++),因为这一层并不是最后一层数组,所以需要一个数组来存储;
for (int x: row) // 范围遍历,相当于for(int j = 0 ; j < a[i].length;j++),这是最后一层数组,所以只需要用一个变量就能即时存储与打印;
System.out.printf("%d ", x);
System.out.println();
}
}
}
4.常用API
1.length:返回数组长度,注意不加小括号
int[] a={2,5,4,3,1,8};
int sz = a.length;
2.Arrays.sort():数组排序
//以下每一次sort都是按照原数组进行,前后操作假装不影响;
int[] a={2,5,4,3,1,8};
//-------将整个数组从小到大排列-------
Arrays.sort(a);//1 2 3 4 5 8
//-------将数组从下标i到下标j的数组从小到大排列-------
Arrays.sort(a,2,5);//2 5 1 3 4 8
3.Arrays.fill(int[] a, int val):填充数组
//-------将数组全部填充为x-------
int[] a = new int[10];
Arrays.fill(a , 100);
//-------指定从下标i到下标j的区域填充为x-------
int[] a = new int[10];
Arrays.fill(a , 3 , 5 , 1000);
4.Arrays.toString():将数组转化为字符串
多用在项目里
int[] a = {1 , 4 , 1 , 5 , 9}
System.out.println(Arrays.toString(a));
打印出来的是
[1 , 4 , 1 , 5 , 9]
而直接打印a和直接打印a.toString()打印出来的都是地址;
System.out.println(a);
System.out.println(a.toString());
以上两种打印出来的都是地址,每个人应该都不一样;
[I@70dea4e
5.Arrays.deepToString():将多维数组转化为字符串
对于多维数组而言,toString又不好使了,它只能打印二维数组中第一维数组的地址;
所以要用到Arrays.deepToString()
import java.util.Arrays;
public class TestDeepToString {
public static void main(String[] args) {
int[] array1 = {6, 6, 6};
int[] array2 = {8, 8, 8};
int[][] array3 = {array1, array2};
System.out.println(Arrays.deepToString(array3)); //[[6, 6, 6], [8, 8, 8]]
System.out.println(Arrays.toString(array3)); //[[I@511d50c0, [I@60e53b93]
6.注意
1.java中的数组不可变长
2.使用Arrays需要import java.util.Arrays;

浙公网安备 33010602011771号