一、数组的概述
- 概述:用来存储多个相同数据类型的一个容器
- 举例:
有一家公司,公司有50个员工。
问题1:统计50个员工的总薪资?
问题2:统计50个员工中的最高薪资,最低薪资? - 原因:
使用数组想要存储或者操作多个数据,比较简单。 - 数组定义:
数据类型[] 数组名称 = new 数据类型[元素的个数]; - 说明:
(1)数据类型:表示数组存储的元素的数据类型
(2)[]:表示一个一维数组
(3)数组名称:小驼峰命名法 合法的标识符即可
(4)=:赋值符号
(5)new:表示一个关键字。在堆内存中个数组创建空间的关键字
(6)数据类型:和前面的数据类型保持一致即可
(7)元素的个数:表示数组中可以存储多少个数据 - 打印数组名称的结果:
[I@15db9742:统称为数组的地址
[:表示是一个一维数组
I:表示数组中存储的是一个整数
@:表示一个普通的分隔符
15db9742:Java通过哈希算法,计算数组的地址得来的一个十进制的数据,又将十 进制的数据转换为十六进制表示。
代码
class Demo01 {
public static void main(String[] args) {
//定义一个数组,用来存储4个人的年龄
int[] arr = new int[4];
//打印的结果为数组的地址
System.out.println(arr);
}
}
二、数组的初始化
-
初始化:表示给数组分配空间并赋值
-
数组初始化的分类:
动态初始化
静态初始化 -
动态初始化:
数组的定义:
数据类型[] 数组名称 = new 数据类型[元素的个数];
数据类型 数组名称[] = new 数据类型[元素的个数];
数组的赋值:
数组名称[元素索引] = 元素值;元素:数组中存储的数据
索引:数组中的每一个位置都有一个有序的序号来表示
范围:0-----元素的个数-1 -
注意事项:
(1)如果数组中的位置没有赋值,会有一个默认值
整数:0 小数:0.0 字符:’ ’ String:null 布尔:false
(2)给数组赋值的时候,元素的数据类型,要和定义的类型保持一致 -
静态初始化:
格式:
元素的数据类型[] 数组名称 = new 数据类型[]{元素值的罗列};
注意事项:
(1)静态初始化后面的小括号中不需要跟元素的个数
(2)将想要存储的数据,直接在大括号中定义即可
(3)数据之间使用逗号分隔
(4)元素的类型,要和定义的类型保持一致
(5)静态初始化有一种简写格式:
元素的数据类型[] 数组名称= {元素值的罗列};
注意:简写格式不能分成两行。
代码
class Demo01 {
public static void main(String[] args) {
//动态初始化
int[] arr = new int[4];
//打印的结果为数组的地址
System.out.println(arr);
//给数组的每一个位置赋值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//arr[3] = 40;
//获取数组中每一个位置中的元素
System.out.println(arr[0] + "..." + arr[1] + "..." + arr[2] + "..." + arr[3]);
//静态初始化
int[] arr2;
arr2 = new int[]{100,200,300};
System.out.println(arr2[0] + "..." + arr2[1] + "..." + arr2[2]);
//静态简写格式:
int[] arr3 = {1000,2000,3000};
System.out.println(arr3[0] + "..." + arr3[1] + "..." + arr3[2]);
}
}
三、数组的内存图示
JVM内存划分
- JVM:java虚拟机, 执行java的容器
- JVM中有很多区域的划分,不同的区域执行的内容不同,表示的功能也不同
- 分类:
栈内存:执行方法 先进后出,后进先出
堆内存:用来存储数组,对象等数据量比较大的数据
方法区:用来存储类的字节码对象 静态数据
本地方法区:用来执行本地方法,或者存储本地方法所需的一些数据
程序计数器:控制线程的正常执行
一个数组在内存中的图示
总结:
(1)数组中的元素在堆内存中存储的
(2)数组中的每一个元素的位置有序存储的
(3)数组的变量中存储的是数组所在空间的地址值
两个数组的内存图示
总结:
(1)new关键字表示新建数组,遇到一次重新创建一个
(2)创建的两个数组,使用两个变量来存储不同的地址。两个数组之间互不影响
两个引用指向同一个数组内存图
引用:表示地址(Java语言对地址的一种称呼)
两个引用指向同一个数组:两个变量中存储的地址,是同一个数组的地址
引用数据类型:变量中存储的是元素的地址
注意:
当两个变量中存储的是同一个数组的地址,其中一个变量将数组中的内容进行了修改, 另外一个变量再访问数组的时候,访问的内容是修改之后的。
四、数组的异常
- 异常:表示一些不正常的情况。表示一些导致程序出错的问题。
- 异常类型1:Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
数组索引越界异常:
(1)原因:访问的索引不在定义的范围内 范围:0—个数-1
(2)解决的方式:不访问范围外的索引 - 异常类型2:Exception in thread “main” java.lang.NullPointerException
空指针异常:
指针:表示地址
(1)原因:当数组的地址值赋值为Null之后,就无法再通过该变量访问数组中的元素
如果仍然访问,会出现空指针异常。
(2)解决方式:在访问数组之前,可以通过判断,判断数组的地址是否等于null,如果不等于null,再去访问。
(3)注意事项:当数组的地址为null,访问数组的变量名,不会出现空指针异常,返回的结果为Null
代码
class Demo04 {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//运行报错:访问了不存在的索引,出现索引越界异常
//arr[3] = 40;
System.out.println(arr[0] + "..." + arr[1] + "..." + arr[2]/* + "..." + arr[-1]*/);
arr = null;
//返回的地址值为null
System.out.println(arr);
if(arr != null){
//如果数组的地址为Null。仍然访问数组中的元素,出现空指针异常
System.out.println(arr[0] + "..." + arr[1] + "..." + arr[2]);
}else{
System.out.println("数组的地址为空,无法访问元素值");
}
}
}