Java数组模块
1.数组定义
数组(array)是一种用于存储多个相同类型数据的存储格式
数组两种定义格式:
- 数据类型[] 变量名
定义类一个int类型的数组变量,变量名为arr,推荐使用
int[] arr
- 数据类型 变量名[]
int arr[]
2.数组初始化
java数组必须先初始化才能使用
初始化:为数组中的数组元素分配内存空间,为每个数组元素赋值
数组初始化方法
- 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名 = new 数据类型[数组长度];
int [] arr = new int[3]
示例
public class ArrayDemo {
public static void main(String[] args) {
// 数组动态初始化
int[] arr = new int[3];
/*
左:
int:数组中元素为int类型
[]:这是一个数组
arr:数组的名称
右:
new:为数组申请内存空间
int:数组元素为int类型
[]:这是一个数组
3:数组长度,就是数组中元素的个数
*/
}
}
3.数组元素访问
数组内部元素的访问方式
格式:数组名[索引]
-
索引:数组中数据的编号方式
-
作用:用于访问数组中的数据,数组名[索引]等同于变量名,一种特殊的变量名
- 特征1:索引从0开始
- 特征2:索引是连续的
- 特征3:逐一增加,每次加1
public class ArrayDemo {
public static void main(String[] args) {
// 数组动态初始化
int[] arr = new int[3];
// 输出数组名
System.out.println(arr); // [I@5a39699c
// 输出数组中的元素
System.out.println(arr[0]); // 0
System.out.println(arr[1]); // 0
System.out.println(arr[2]); // 0
}
}
4.内存分配
java内存分配
int[] arr = new int[3];
// 输出数组名
System.out.println(arr); // [I@5a39699c 内存地址
// 输出数组中的元素
System.out.println(arr[0]); // 0
System.out.println(arr[1]); // 0
System.out.println(arr[2]); // 0
new:开辟内存空间
内存中取值的过程
内存分配类别
- 栈内存:存储局部变量
定义在方法中的变量,例如:arr
使用完毕立即消失
- 堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
整数:默认值0
浮点数:默认值0.0
布尔值:默认值false
字符:默认是空字符
引用数据类型:默认是null
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收期空闲时被回收。
数组内存图(单个数组)
![Kapture 2020-07-03 at 20.48.53](/Users/ryxiong/desk/目前学习/java基础/resource/Kapture 2020-07-03 at 20.48.53.gif)
数组内存图(多个)
![Kapture 2020-07-03 at 20.56.13](/Users/ryxiong/desk/目前学习/java基础/resource/Kapture 2020-07-03 at 20.56.13.gif)
数组内存图(多个指向同一个)
![Kapture 2020-07-03 at 20.59.47](/Users/ryxiong/desk/目前学习/java基础/resource/Kapture 2020-07-03 at 20.59.47.gif)
5.数组初始化-静态初始化
静态初始化:初始化时指定每个数组元素的初始值,有系统决定数组长度
格式: 数据类型[] 变量名 = new 数据类型[] {数据1, 数据2, 数据3, ...}
示例:
int[] arr = new int[] {1, 2, 3}
简化格式:数据类型[] 变量名 = {数据1, 数据2, 数据3,...}
推荐:
int[] arr = {1, 2, 3}
例子
public class ArrayDemo01 {
public static void main(String[] args) {
// 定义数组
int [] arr = {1, 2, 3};
// 输出数组名
System.out.println(arr);
// 输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
/*
[I@5a39699c
1
2
3
*/
5.数组操作的问题
越界索引:访问数组中不存的索引对应的元素,造成索引越界问题
public class ArrayDemo02 {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[3]);
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at java_01.ArrayDemo02.main(ArrayDemo02.java:6)
空指针异常:访问数组已经不再指向堆内存的数据,造成空指针异常
public class ArrayDemo03 {
public static void main(String[] args) {
int[] arr = new int[3];
// 把null赋值给数组
arr = null;
System.out.println(arr[0]);
}
}
Exception in thread "main" java.lang.NullPointerException
at java_01.ArrayDemo03.main(ArrayDemo03.java:8)
7.数据常见操作
数组遍历
获取数组长度
数组名.length
示例:arr.length
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
// 遍历数组
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
}
}
获取最值
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
int max = arr[0];
// 遍历数组
for(int i=0; i<arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println(max);
}
}