一、Java内存分配介绍
- 栈
- 堆
- 方法区
- 本地方法栈
- 寄存器
通过例子来介绍细节
package com.app.memory;
public class ArrayDemo1 {
public static void main(String[] args) {
// 目标:理解Java内存分配介绍
// 定义一个变量,初始值10
int a = 10;
// 定义一个数组,元素值:11,22,33
int[] arr = new int[]{11,22,33};
System.out.println(arr);
// 修改数组中的元素值
arr[0] = 44;
arr[1] = 55;
arr[2] = 66;
// 访问数组中的元素值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
输出结果:
[I@119d7047
44
55
66
二、两个数组变量指向同一个数组对象
package com.app.memory;
public class ArrayDemo2 {
public static void main(String[] args) {
// 目标:理解两个变量指向同一个对象
// 1.定义数组1,元素值:11,22,33
int[] arr1 = {11,22,33};
// 2.定义数组2,将数组1赋值给数组2
int[] arr2 = arr1;
// 3.输出数组1,2的内存地址
System.out.println(arr1);
System.out.println(arr2);
// 4.修改数组1的某个元素值为99
arr1[1] = 99;
// 5.同时访问两个数组,你会发现,都是一样的
System.out.println(arr1[1]);
System.out.println(arr2[1]);
}
}
输出结果:
[I@119d7047
[I@119d7047
99
99
原理
三、数组使用的常见问题
-
问题1:如果访问的元素位置超过最大索引,执行时会出现 ArrayIndexOutOfBoundsException(数组索引越界异常)
// 例子 int[] arr = new int[]{11, 22, 33}; // 0 1 2 System.out.println(arr[2]); // 访问该数组最后一个元素值 // System.out.println(arr[3]); // 出现数组索引越界异常,索引是从0开始:0 1 2 3,因此 3 属于第四个元素值
-
问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现 NullPointerException(空指针异常)
// 例子 int[] arr = null; // 输出数组内存地址 System.out.println(arr); // 输出结果为:null // 调用数组属性功能: length——>查看元素个数 // System.out.println(arr.length); // 出现空指针异常,因为是null,没有指针,指向啥都不知道!
四、Debug工具
- IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。
Debug工具基本使用步骤:
- 在需要控制的代码行左侧,点击一下,形成断点
- 选择使用Debug方式启动程序,启动后程序会在断点处暂停
- 控制代码一行一行的往下执行