1、数组:就是用于存储相同数据类型的数据的容器
2、使用数组的原因:
没有数组:存在多个变量,需要声明多个变量的名称,这些名称之间没有什么关系和规律。想访问所有的变量,就比较困难。
有了数组:只需要有一个数组容器的名称,容器里面有通过数字表示的位置。位置的数字又有规律的。可以通过容器名称结合位置数字的方式,访问到某个变量。非常容易的访问所有的变量。通过有规律的索引,来访问没有规律的元素。
3、数组的定义:四种方法
(1)数组元素的数据类型[] 数组名称 = new 元素的数据类型[数组容器的大小];
eg:int[] scores = new int[3];
(2)数组元素的数据类型[] 数组名; eg:int[] scores;
数组名 = new 数组元素类型[数组长度]; scores = new int[3];
(3)数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2....};
eg:int[] scores = new int[]{33,33,44};
(4)数组元素类型[] 数组名 = {元素1,元素2.....};
eg: int[] scores = {33,33,44};
4、详细解释:
元素:数组中的数据、数组中的变量
元素的数据类型:数组中的数据的数据类型,用于决定每个空间的大小
[]:表示是一个一维数组
数组名称:数组本身也是一个变量,用于存储数组的地址的变量。
=:赋值符号,将数组的地址,赋值给数组的名称
new:用于在堆内存中开辟空间
元素的数据类型:和前面的元素的数据类型保持一致
数组容器的大小:可以存储数据的个数
5、打印的数组的结果解释:[I@15db9742
[:表示这是一个一维数组
I:表示数组中存储的是int类型的数据
@:普通的分隔符
15db9742:数组有一个内存地址,通过hashCode方法,将这个内存地址计算成了一个数字,用于表示这个内存地质,将这个数字转成十六进制的表示形式
说明:以后将打印结果,简称为数组的地址
Jvm内存的划分
1、jvm是执行java程序的容器,空间很大,需要划分不同的区域:不同的功能,需要使用不同特点的区域来完成。分为:栈内存、堆内存、方法区、本地方法区、程序计数器
2、栈内存【常用】:用于执行方法,每个方法单独的分配一段空间,称为栈帧,把给方法分配内存空间,形象的称为“进栈”。特点:先进后出
3、堆内存【常用】:用于存储数组、对象等数据量较大的数据。一般都是引用数据类型。
4、方法区【常用】:用于存储类的字节码对象,存储常量、存储静态变量
5、本地方法区:用于执行本地方法。C语言、C++方法就是本地方法。
6、程序计数器:用于控制程序的执行、控制程序执行哪行代码
两个引用指向同一个数组
1、引用:
在内存中的一个变量,存储另外一个数据的地址。
称数据的地址,为引用
存储引用的变量,称为引用数据类型的变量
2、两个引用指向了同一个数组:
任意一个引用修改了数组中的内容
另外一个数组也能访问到修改了的数据
3、图示:
数组的异常
1、在程序运行过程中,出现了和生活正常情况不符的条件,就没有必要让程序继续执行下去。将这个情况的信息,封装成一个对象,就是异常对象。一旦有了异常对象,程序就会做一些跳转甚至结束。
2、数组操作的过程中,可能会发生的两个异常:
数组索引越界异常:
原因:访问了数组中,不存在的索引。数组索引的范围是0~长度-1,超过了这个范围都是越界
避免:不要访问不存在的索引
空指针异常:
原因:当引用不再指向任何的堆内存中的数据时,仍然要通过这个引用访问堆内存中的数据,只能抛出异常。
避免:在使用引用之前,可以先判断是否为null,不为null的时候再去访问
数组的遍历
class Test { public static void main(String[] args) { int[] arr = {11,22,33,44,55}; //定义循环,获取所有的索引,由于i不仅表示循环的控制,还表示数组的索引 //所以从0开始 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
数组中取最大值
class Test2 { public static void main(String[] args) { int[] arr = {23, 34 -12, 66, 11, 78}; int max = arr[0];// 假设数组的第一个元素为最大值 for (int i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i];//替换成比max大的元素的值 } } //循环结束之后,max就是数组的最大值 System.out.println(max); } }
数组的反转
class Test3{ public static void main(String[] args) { int[] arr = {11,22,55,3,5,9}; //调用方法,遍历数组内容 printArr(arr); //对数组进行反转:获取对称位置的索引 for (int i = 0, j = arr.length - 1; i < j; i++, j--) { //i和j位置的元素,进行交换 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } //反转完成之后,再次遍历数组内容 printArr(arr); } /*定义一个方法,遍历一个int类型的数组 返回值类型:void,因为只需要打印出来即可 参数列表: */ public static void printArr(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } }