一. 数组定义格式
格式1:数据类型[] 变量名;
范例:int[] arr;
格式2:数据类型 变量名[];
范例: int arr[];
二. 数组初始化方式
1.1静态初始化:【初始化时指定每个数组元素的初始值,由系统决定数组长度】
格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,…};
范例:int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3};
1.2动态初始化:【初始化时只指定数组长度,由系统为数组分配初始值】
格式:数据类型[] 变量名 = new 数据类型[数组长度];
范例:int[] arr = new int[3];
代码案例:
//格式:数据类型[] 变量名 = new 数据类型[数组长度];
int[] arr = new int[3];
//修改数组中的元素
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
1.3使用场景:
静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景
动态初始化:指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景
1.4注意:
两种初始化的方式是独立的,不可以混用
如错误使用:int[] arr = new int[3]{30,40,50};
三.数组元素访问
(1)数组变量访问方式
格式:数组名
(2)数组内部保存的数据的访问方式
格式:数组名[索引]
(3)数组元素访问代码案例
public class ArrayDemo {
public static void main(String[] args) {
//1.定义一个数组,并进行初始化
int[] scores = new int[]{93,96,99}; //int[] scores = {93,96,99};
//2.输出数组名
System.out.println(scores); //[I@776ec8df
//3.输出数组中的元素
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
System.out.println("-----------");
//4.修改数组中的元素
scores[0] = 100;
scores[1] = 98;
scores[2] = 95;
//5.再次输出数组中的元素
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
}
}
四.数组常见操作
(1)数组遍历
public class ArrayTest01 {
public static void main(String[] args) {
//1.定义数组并初始化
int[] arr = {77, 88, 99, 66, 55, 44};
//2.获取数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
//3.用循环改进
for (int i=0; i<5; i++) {
System.out.println(arr[i]);
}
//4.格式:数组名.length
System.out.println(arr.length);
for (int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
}
}
(2)获取数组最大值
public class ArrayTest02 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {12, 45, 98, 73, 60};
//2.定义变量max存储最大值,取第一个数据为变量的初始值
int max = arr[0];
//3.与数组中剩余数据逐个比对,每次比对将最大值保存到变量max中
for (int i=1; i<arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
}
//4.循环结束后输出变量max的值
System.out.println("max:" + max);
}
}
(3)数组元素打乱
1.1涉及到的操作
获取数组中元素的随机索引
Random r = new Random();
int index = r.nextInt(arr.length);
数组中元素交换
int a = 10;
int b = 20;
int temp = a;
a = b;
b = temp;
1.2数组元素打乱代码实现
public class ArrayTest03 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {12, 45, 98, 73, 60};
//2.生成随机交换的索引
Random r = new Random();
int index = r.nextInt(arr.length);
//3.第一次交换
int temp = arr[0];
arr[0] = arr[index];
arr[index] = temp;
//4.第二次交换
index = r.nextInt(arr.length);
temp = arr[1];
arr[1] = arr[index];
arr[index] = temp;
//5.遍历交换
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//6.遍历输出数组[idea快捷方式:arr.fori]
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
四.数组案例练习
(1)需求:
定义一个可以存储5个元素的int数组,数据来自于键盘录入,
最后遍历数组,把元素输出在控制台
public class ArrayTest {
public static void main(String[] args) {
//1.定义一个数组,并进行动态初始化
int[] arr = new int[5];
//2.创建键盘录入对象
Scanner sc = new Scanner(System.in);
//3.循环录入数据并赋值给数组元素
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个元素:");
arr[i] = sc.nextInt();
}
//4.调用方法遍历数组
printArray(arr);
}
/*
*定义一个循环遍历数组方法,并优化输出数组显示。
*/
public static void printArray(int[] arr) {
System.out.print("["); //输出内容不换行
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1) {
System.out.print(arr[i]); //输出内容不换行
}else {
System.out.print(arr[i] + ", "); //输出内容不换行
}
}
System.out.println("]"); //输出内容并换行
}
}
五.数组内存图
六.数组访问和使用问题
(1)索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
int[] arr = new int[3];
System.out.println(arr[3]);
(2)空指针异常:对象不再指向堆内存,还想继续访问数据,访问失败
Exception in thread “main” java.lang.NullPointerException: Cannot load from int array because “arr” is null
int[] arr = new int[3];
arr = null;
System.out.println(arr[0]);
//解决空指针异常
if(arr != null) { System.out.println(arr[0]); }