6、数组
6.1、数组的概述
数组(Array):
-
是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组的常见概念: -
数组名
-
下标(或索引)
-
元素
-
数组的长度:元素的个数
数组的特点:
- 数组是有序排列的
- 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
- 数组的长度一旦确定,就不能修改。
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
数组的分类:
- 按照维度:一维数组、二维数组、三维数组、…
- 按照元素的数据类型分:
- 基本数据类型元素的数组
- 引用数据类型元素的数据(即对象数组)
6.2、一维数组的使用
- 一维数组的声明和初始化
- 如何调用数组的指定位置的元素
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始化值
- 数组的内存解析
1、一维数组的声明和初始化
public static void main(String[] args) {
//一维数组的声明和初始化
int num;//声明
num = 10;//初始化
int id = 1001;//声明和初始化
int[] ids;//声明
//静态初始化:
//数组的初始化和数组元素的赋值操作同时进行
ids = new int[] {1001,1002,1003};
//动态初始化:
//数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[6];
}
//一些正确写法
int[] arr4 = {1,2,3,4,5};//类型推断
//只有声明和赋值一行才可以类型推断
总结:
- 数组一旦初始化完成,其长度就确定了。
2、如何调用数组的指定位置的元素
- 通过角标的方式调用
//数组的角标(或索引)从0开始的,到数组的长度-1结束。
names[0] = "魔神";
names[1] = "凯撒";
names[2] = "凯撒";
names[3] = "凯撒";
names[4] = "凯撒";
names[5] = "凯撒";
//Ctrl+alt+↓ 复制到下一行
names[6] = "凯撒";//越界!Index 6 out of bounds for length 6
3、如何获取数组的长度
属性:length
System.out.println(names.length);
System.out.println(ids.length);
结果:
6
3
4、如何遍历数组
/*
System.out.println(names[0]);
System.out.println(names[1]);
Ctrl+/注释或者取消注释
Ctrl+shift+/ 多行注释
Ctrl+shift+\ 取消多行注释
*/
for(int i = 0;i <= names.length;i++) {
System.out.println(names[i]);
}
5、数组元素的默认初始化值
- 数组元素是整型: 0
- 数组元素是浮点型: 0.0
- 数组元素是char型:ASCII 中 0(null) 或者 ‘/u0000’, 而非‘0’
- 数组元素是boolean型:false
- 数组元素是引用数据类型:null
int[] arr = new int[4];
for(int i = 0;i < arr.length;i++) {
System.out.println(arr[i]);
}
结果:
0
0
0
0
6、数组的内存解析(简单理解)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11V9KQhk-1621434244035)(https://www.picbed.cn/images/2021/05/17/1.png)]
6.3、多维数组的使用
- Java语言里提供了支持多维数组的语法
- 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格。
- 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在,其实,从数组底层的运行机制来看,其实没有多维数组。
二维数组的使用:
规定:二维数组分为外层数组的元素,内层数组的元素
- 二维数组的声明和初始化
- 如何调用数组的指定位置的元素
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始化值
- 数组的内存解析
1、二维数组的声明和初始化
int[] arr = new int[] {1,2,3};//一维数组
//1、二维数组的声明和初始化
//静态初始化
int[][] arr1 = new int[][] {{1,2,3},{4,5,6}};
//动态初始化1
int[][] arr2 = new int[3][2];
//动态初始化2
int[][] arr3 = new int[3][];
//一些正确写法
int arr4[][] = new int[][] {{1,2,3},{4,5,6}};
int[] arr5[] = new int[][] {{1,2,3},{4,5,6}};
2、如何调用数组的指定位置的元素
//1、二维数组的声明和初始化
//静态初始化
int[][] arr1 = new int[][] {{1,2,3},{4,5,6}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
//如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
arr3[1] = new String[4];//没有这个就会出现java.lang.NullPointerException
System.out.println(arr3[1][0]);
结果:
2
null
null
3、如何获取数组的长度
//1、二维数组的声明和初始化
//静态初始化
int[][] arr1 = new int[][] {{1,2,3},{4,5,6}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
int arr4[][] = new int[][] {{1,2,3},{4,5,6}};
int[] arr5[] = new int[][] {{1,2,3},{4,5,6}};
//如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
arr3[1] = new String[4];
System.out.println(arr3[1][0]);//java.lang.NullPointerException
//获取长度!!!
System.out.println(arr4.length);
System.out.println(arr4[0].length);
4、如何遍历数组
for(int i = 0; i < arr4.length;i++) {
for(int j = 0; j < arr4[i].length;j++) {
System.out.println(arr4[i][j]);
}
}
5、数组元素的默认初始化值
int[][] arr = new int[4][3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);
//结果
[[I@182decdb//[[表示二维数组,I表示int型,@后面表示地址
[I@7637f22
0
float[][] arr = new float[4][3];
System.out.println(arr[0]);
System.out.println(arr[0][0]);
结果:
[F@182decdb
0.0
String[][] arr = new String[4][3];
System.out.println(arr[0]);
System.out.println(arr[0][0]);
结果:
[Ljava.lang.String;@182decdb
null
double[][] arr = new double[4][];
System.out.println(arr[1]);//null 数组是引用数据类型
System.out.println(arr[0][0]);//空指针异常
针对于初始化方式一:
比如:int[][] arr = new int[4][3];
外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组初始化情况相同!
针对于初始化方式二:
比如:int[][] arr = new int[4][];
外层元素的初始化值为:null
内层元素的初始化值为:不能调用!
6、数组的内存解析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1tEbg1J-1621434244047)(https://www.picbed.cn/images/2021/05/19/3.png)]
6.5、Arrays工具类的使用
某个类后面加S 一般是这个类的工具类
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组
- 比如排序和搜索
的各种方法。
boolean equals(int[] a,int[] b) | 判断两个数组是否相等 |
---|---|
String toString(int[] a) | 输出数组信息 |
void fill(int[] a,int val) | 将指定值填充到数组之中 |
void sort(int[] a) | 对数组进行排序 |
int binarySearch(int[] a,int key) | 对排序后的数组进行二分法检索指定的值 |
演示:
/*
* java.util.Arrays:操作数组的工具类。
* 里面定义了很多操作数组的方法
*
*/
//1、 boolean equals(int[] a,int[] b)
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,4,2,3};
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals);
//int[] arr1 = new int[]{1,2,3,4};
//int[] arr2 = new int[]{1,2,3,4};
//true
//2、 String toString(int[] a)
System.out.println(Arrays.toString(arr1));
//[1, 2, 3, 4]
//3、 void fill(int[] a,int val)
Arrays.fill(arr1, 10);
System.out.println(Arrays.toString(arr1));
//[10, 10, 10, 10]
//4、 void sort(int[] a)
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//[1, 2, 3, 4]
//5、 int binarySearch(int[] a,int key)
int[] arr = new int[] {-98,-34,2,34,54,66,79,105,210,333};
int index = Arrays.binarySearch(arr, 210);
System.out.println(index);//负数就是没找到!
结果:
false
[1, 2, 3, 4]
[10, 10, 10, 10]
[1, 2, 3, 4]
8
6.6、数组使用中的常见异常
数组中常见异常:
1、数组角标越界的异常:(左右都有越界)
- ArrayIndexOutOfBoundsException
2、空指针异常:
- NullPointerException
//情况1
int[] arr = new int[]{1,2,3};
arr=null;
System.out.println(arr[0]);
本指向数组,赋值为null,无指向,则为空指针!
//情况2
int[][] arr = new int[4][];
System.out.println(arr[0][0]);
//情况2
String[] arr = new String[] {"AA","BB","CC"};
System.out.println(arr[0].toString());
//输出AA
String[] arr = new String[] {"AA","BB","CC"};
arr[0] = null;
System.out.println(arr[0].toString());
//此时空指针异常