数组定义和访问
1.数组定义
数组定义方法有三种:
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
1
int[] arr = new int[3];
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
1
int[] arr = new int[]{1,2,3,4,5};
数据类型[] 数组名 = {元素1,元素2,元素3…};
1
int[] arr = {1,2,3,4,5};
2.数组的访问
索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引
(index),可以通过数组的索引访问到数组中的元素。1
2
3
4
5
6
7
8
9
10
11public static void main(String[] args) {
//定义存储int类型数组,赋值元素1,2,3,4,5
int[] arr = {1,2,3,4,5};
//为0索引元素赋值为6
arr[0] = 6;
//获取数组0索引上的元素
int i = arr[0];
System.out.println(i);
//直接输出数组0索引元素
System.out.println(arr[0]);
}数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1 。
1
2
3
4
5public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println(arr.length);
}
数组原理内存图
1.内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2.Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
JVM的内存划分:
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
3.数组在内存中的存储
3.1 一个数组内存图
1 | public static void main(String[] args) { |
以上方法执行,输出的结果是[I@5f150435,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。
输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
3.2 两个数组内存图
1 | public static void main(String[] args) { |
3.3 两个变量指向一个数组
1 | public static void main(String[] args) { |
数组的常见操作
1.数组越界异常
1 | public static void main(String[] args) { |
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException
数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
2.数组空指针异常
1 | public static void main(String[] args) { |
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出NullPointerException
空指针异常。在开发中,数组空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
数组作为方法参数和返回值
1.数组作为方法参数
以前的方法中我们学习了方法的参数和返回值,但是使用的都是基本数据类型。那么作为引用类型的数组能否作为方法的参数进行传递呢,当然是可以的。
数组作为方法参数传递,传递的参数是数组内存的地址。
1 | public static void main(String[] args) { |
2.数组作为方法返回值
数组作为方法的返回值,返回的是数组的内存地址
1 | public static void main(String[] args) { |
3.方法的参数类型区别
1 | public static void main(String[] args) { |
方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.