6. 数组的内存图
6.1 内存解释
内存是计算机中的重要原件,也是临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
即: Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
JVM的内存划分
1.栈: 存储局部变量以及所有代码执行的.
局部变量: 指的是定义在方法中, 或者方法声明上的变量.
特点: 先进后出.
2.堆: 存储所有new出来的内容(即: 对象).
特点: 堆中的内容会在不确定的时间, 被GC回收.
3.方法区: 存储字节码文件的.
字节码文件: 指的是后缀名为.class的文件.
4.本地方法区:
和系统相关, 了解即可.
5.寄存器
和CPU相关, 了解即可.
6.2 案例: 一个数组内存图
查看如下代码:
public class ArrayDemo03 {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[0]); //打印数组中的第一个元素, 值为: 0
System.out.println(arr); //[I@1540e19d
}
}
其中[I@1540e19d是arr数组的地址值, 那这段代码在内存中的执行流程是怎样的呢? 我们一块儿来看下:
图解
7. 两个小问题
数组是我们在实际开发中用到的比较多的容器, 在使用它的时候, 很可能会遇到如下的两个问题:
1.数组索引越界异常(ArrayIndexOutOfBoundsException)
2.空指针异常(NullPointerException)
7.1 数组索引越界异常
产生原因 访问了数组中不存在的索引.
解决方案
访问数组中存在的索引即可.
示例
1.定义int类型的数组, 存储元素11, 22.
2.打印数组中的第2个元素.
3.尝试打印数组中的第3个元素.
参考代码
public class ArrayDemo06 {
public static void main(String[] args) {
//1. 定义int类型的数组, 存储元素11, 22.
int[] arr = {11, 22};
//2. 打印数组中的第2个元素.
System.out.println("arr[1]: " + arr[1]);
//3. 尝试打印数组中的第3个元素.
System.out.println("arr[2]: " + arr[2]);
}
}
7.2 空指针异常
产生原因
访问了空对象. 即: 对象为空, 你还去调用它的一些方法, 肯定不行.
解决方案
对对象赋具体的值即可.
示例
1.定义int类型的数组, 存储元素11, 22.
2.将null(空常量)赋值给数组.
3.尝试打印数组的第一个元素.
参考代码
public class ArrayDemo07 {
public static void main(String[] args) {
//1. 定义int类型的数组, 存储元素11, 22.
int[] arr = {11, 22};
//2. 将null(空常量)赋值给数组.
arr = null;
//3. 尝试打印数组的第一个元素.
System.out.println("arr[0]: " + arr[0]);
}
}
8. 数组的常见操作
数组是我们在实际开发中用到的比较多的一种容器, 它的常见操作如下:
1.遍历数组.
2.获取数组的最值(最大值, 或者最小值).
3.反转数组.
8.1 案例一: 遍历数组
需求
1.定义int类型的数组arr, 存储元素11, 22, 33, 44, 55.
2.通过for循环, 遍历数组.
参考代码
public class ArrayDemo08 {
public static void main(String[] args) {
//1. 定义int类型的数组arr, 存储元素11, 22, 33, 44, 55.
int[] arr = {11, 22, 33, 44, 55};
//2. 通过for循环, 遍历数组.
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
8.2 案例二: 获取数组的最大值
需求
已知各位美女的颜值如下图, 请求出下图中, 颜值最高的数字, 并打印到控制台上.
即:求数组int[] arr = {5, 15, 2000, 10000, 100, 4000};的最大值.
参考代码
public class ArrayDemo09 {
public static void main(String[] args) {
//需求: 求数组int[] arr = {5, 15, 2000, 10000, 100, 4000};的最大值.
int[] arr = {5, 15, 2000, 10000, 100, 4000};
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (max < arr[i])
max = arr[i];
}
System.out.println("颜值最高的人的颜值为: " + max);
}
}