1、数组的概念
数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
特点:
1.数组是有序排列的。
2.数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
3.创建数组对象会在内存中开辟一整块连续的空间。
4.数组的长度一旦确定,就不能修改。
2、一维数组的使用
2.1 一维数组的声明和初始化
- 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[] ids = new int[]{1001, 1002, 1003, 1004};
- 动态初始化:数组的初始化和数组元素的赋值操作分开进行。
String[] names = new String[5];
- 也是正确的写法(不是标准的写法)
int ids[] = {1001, 1002, 1003, 1004};
int[] ids = {1001, 1002, 1003, 1004}; // 不加new,类型推断
总结:数组一旦初始化完成,其长度就确定了。
2.2 如何调用数组的指定位置的元素
names[0] = "姓名一";
names[1] = "姓名二";
names[2] = "姓名三";
names[3] = "姓名四";
names[4] = "姓名五";
2.3 如何获取数组的长度
属性:length
System.out.println(names.length); // 5
2.4 如何遍历数组
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
2.5 数组元素的默认初始化值
- 数组元素是整型时,默认初始化值是
0
。·
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 0 0 0 0
}
- 数组元素是浮点型时,默认初始化值是
0.0
。
float[] arr1 = new float[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]); // 0.0
}
-
char
类型,默认初始化值是ASSIC码为0对应的那个字符,为0
或'\u000'
,而非'0'
。
char[] arr2 = new char[4];
arr2[0] == 0; // true
- 数组元素是
boolean
时,默认初始化值是false
。 - 数组元素是引用数据类型时,默认初始化值是
null
。
2.6 数组的内存解析
内存结构(JVM当中实现的),所以,不同的jdk当中,内存的结构也有所区别。以下讲解一个比较稳定的结构。
列举内存当中几个主要的结构:
- 栈(stack):主要存放局部变量
- 堆(heap):主要存放
new
出来的结构,如数组、对象。 - 方法区,包含常量池,静态域(静态的一些变量),和一些类加载的信息。
3、二维数组的使用
3.1 二维数组的声明和初始化
- 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
- 动态初始化1:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][2];
- 动态初始化2:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][];
- 也是正确的写法(不是标准的写法)
int arr2[][] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr3[] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr4[] = {{1, 2, 3}, {4, 5}, {6, 7, 8}};
总结:数组一旦初始化完成,其长度就确定了。
3.2 如何调用数组的指定位置的元素
System.out.println(arr[0][0]);
String[][] arr1 = new String[3][];
// 报错
// System.out.println(arr1[0][0]);
3.3 如何获取数组的长度
属性:length
3.4 如何遍历二维数组
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
3.5 数组元素的默认初始化值
规定:二维数组分为外层数组的元素,内层数组的元素。
int[][] arr = new int[4][3];
// 外层元素:arr[0], arr[1]等
// 内层元素:arr[0][0], arr[1][2]等
- 针对初始化方式一,比如:
int[][] arr = new int[4][3];
外层元素的初始化值为:地址值。
内层元素的初始化值为:与一维数组初始化情况相同。 - 针对初始化方式二,比如:
int[][] arr = new int[4][];
外层元素的初始化值为:null
。
内层元素的初始化值为:不能调用,否则报错。
3.6 二维数组的内存解析
4、练习
4.1 使用二维数组打印一个10行的杨辉三角
int [][] arr = new int[10][];
for (int i = 0; i < 10; i++) {
arr[i] = new int[i + 1];
arr[i][0] = arr[i][i] = 1;
for (int j = 0; j <= i; j++) {
if ( j == 0 || j == i) {
System.out.print(1);
}
if (i > 1) {
int num = arr[i - 1][j - 1] + arr[i - 1][j];
System.out.print(num);
arr[i][j] = num;
}
}
System.out.println();
}
5、数组中涉及到的常见算法
5.1 数组元素的赋值(杨辉三角、回形数等)
5.2 求数值型数组中元素的最大值、最小值、平均数、总和等
5.3 数组的复制、反转、查找(线性查找、二分查找)
- 线性查找——从前往后依次查找
5.4 数组元素的排序算法
- 冒泡排序
int[] arr = new int[]{43, 32, 76, -98, 0, 64, 33, -21, 32, 99};
for(int i = 0; i < arr.length - 1; i++){
for(int j=0; j< arr.length - 1 - i; j++){
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
6、Arrays工具类的使用
java.util.Arrays
类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
-
boolean equals(int[] a, int[] b)
:判断两个数组是否相等。
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
// 比较每个位置上的元素是否都相等
Arrays.equals(arr1, arr2); // false
-
String toString(int[] a)
:输出数组信息。
Arrays.toString(arr1); // [1, 2, 3, 4] 字符串类型
-
void fill(int[] a, int val)
:将指定值填充到数组之中。
Arrays.fill(arr1, 10); // [10, 10, 10, 10]
-
void sort(int[] a)
:对数组进行排序。
Arrays.sort(arr2); // [1, 2, 3, 4]
-
int binarySearch(int[] a, int key)
:对排序后的数组进行二分法检索指定的值。
说明:返回指定元素对应的下标;没有找到指定元素时,会返回一个负数。因此,可以根据返回值是否>= 0
来判断是否找到该元素。
int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int index = Arrays.binarySearch(arr3, 210); // 8
7、数组中常见的异常
- 数组角标越界的异常:
ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(arr[4]);
System.out.println(arr[-2]);
- 空指针异常:
NullPointerException
// 情况一:
int[] arr1 = new int[]{1, 2, 3};
arr1 = null;
System.out.println(arr1[0]);
// 情况二:
int[][] arr2 = new int[4][];
System.out.println(arr2[0][0]);
// 情况三:
String[] arr3 = new String[]{"AA", "BB", "CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());