数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
数组定义格式
方式一:
数据类型[] 数组名 //定义一个 int类型数组 ,数组名是arr 推用此方式
int[] arr;
char[] arr;
方式二:
数据类型 数组名[] //定义一个 int类型变量 ,变量名是arr
int arr[];
double arr[];
数组动态初始化
数组动态初始化就是只给定数组的长度,由系统给出默认初始化值
数据类型[] 数组名 = new 数据类型[数组长度];
package com.itheima_01;
import java.security.spec.RSAOtherPrimeInfo;
/*
数组初始化:
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:数组长度,其实就是数组中的元素个数
*/
//输出数组名
System.out.println(arr); //[I@4554617c 地址;申请地址空间时的空间地址
//输出数组中的元素
System.out.println(arr[0]); //0 系统分配
System.out.println(arr[1]); //0 系统分配
System.out.println(arr[2]); //0 系统分配
}
}
内存分配
int [] arr = new int[3]; //执行过程
生成 区域;用于存储 new开辟空间;可以存3个元素;没有元素,默认给3个0(整数默认为0);生成编号
new赋予arr[I@4554617c [I@4554617c
arr[0] arr通过 new空间[I@4554617c 编号指向索引找到对应的值
栈内存 堆内存
存储局部变量 存储new出来的内容(实体,对象);数组在初始化时,会为存储空间添加默认值
- 栈内存:存储局部变量
定义在方法中的变量,例如:arr,使用完毕,立即消失
- 堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
整数:0 浮点数:0.0 布尔:false 字符:空字符 引用数据类型:null
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收
单数组赋值;多数组赋值 过程一样
int [] arr = new int[3]; //执行过程
//给数组中的元素赋值()
arr[0] = 100;
arr[2] = 200;
System.out.println(arr); //[I@4554617c 不变
System.out.println(arr[0]); //100
System.out.println(arr[1]); //0 初始化添加默认值0
System.out.println(arr[2]); //200
多个数组指向相同,其中一个改变堆内存,另一个访问时也是获取修改后的堆内存
public class ArrayDemo2 {
public static void main(String[] args) {
int [] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
//定义第二个数组指向第一个数组;
int [] arr2 =arr;
arr2[0]=111;
arr2[1]=222;
arr2[2]=333;
//输出两个数组的名及元素
System.out.println(arr); //[I@4554617c
System.out.println(arr[0]); //111
System.out.println(arr[1]); //222
System.out.println(arr2); //[I@4554617c
System.out.println(arr[0]); //111
System.out.println(arr2[1]); //222
}
}
静态初始化(常用)
初始化时指定每个数组元素的初始值,由系统决定数组长度
完整版格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
简化版格式:
数据类型[] 数组名 = {元素1,元素2,…};
//静态初始化数组 ;初始化时,将数组直接赋值(不使用默认值)
int [] arr3 = {1,2,3};
System.out.println(arr3[0]); //1
System.out.println(arr3[1]); //2
System.out.println(arr3[2]); //3
数组操作常见小问题
-
索引越界
public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr[3]); } }
数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。 程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不 能出现的,一旦出现了,就必须要修改我们编写的代码。
解决方案:将错误的索引修改为正确的索引范围即可!
-
空指针异常
public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; //把null赋值给数组 arr = null; System.out.println(arr[0]); } }
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时 候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必 须要修改我们编写的代码。
解决方案:给数组一个真正的堆内存空间引用即可
数组遍历
获取数组元素个数:数组名.length 例:arr.length
package com.ArrayDemo_06;
public class ArrayTest01 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组获取最值
package com.ArrayDemo_06;
public class ArrayTest02 {
public static void main(String[] args) {
int [] arr = {22,56,34,77,14};
int i = arr[0];
for (int x=1;x<arr.length;x++){
if (arr[x]>i){
i = arr[x];
}
}
System.out.println(i);
}
}