六、数组存储原理
内存
在讲解数组的存储原理之前,我们需要先来了解一下什么是内存。这样会让我们更好的理解数组的存储原理。
内存: 计算机中很重要的一个元件,是一个临时的存储区域。当程序运行时,我们编写的代码文件虽然存放在硬盘中,硬盘当中的程序文件不会运行,系统会把程序存放进内存当中,当程序运行完毕之后程序会清空内存。这也是为什么当我们开了较多的程序或者软件时,电脑会变得很卡的原因之一。
java虚拟机中的内存划分
我们都知道java程序是在java虚拟机(JVM)中运行的,为了提高运行效率,就对内存空间进行不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。
JVM内存划分
区域名称 | 作用 |
---|---|
寄存器 | 给cpu使用,我们目前不需要任何了解 |
本地方法栈 | JVM在使用操作系统功能时使用的,我们目前也不需要了解 |
方法区 | 存储可以运行的class文件,同时这里也存储着常量池和静态域 |
方法栈(stack) | 方法运行时使用的内存,比如说main方法运行,进入方法栈当中运行 |
堆内存(heap) | 存储对象或者是数组,new出来的对象,统统存储在堆内存中 |
一个数组的内存存储
首先我们先定义一个数组
public static void main(String[] args){
int[] arr = new int[3];
System.out.println(arr);//内存地址哈希值
}
我们运行上面这段代码会得到这样的结果
会出现这样的结果是和数组的存储原理有关。存储的并不是具体的数值,而是数据在内存中的哈希地址值
程序的执行流程:
- main方法进入方法栈中执行
- 创建数组JVM会在堆内存当中开辟空间,存储数组
- 数组在内存当中会有自己的内存地址,以十六进制表示
- 数组当中有三个元素,默认值为0
- JVM会将数组的内存元地址赋值给引用类型变量arr
- 变量arr保存的是数组在内存当中的地址,而不是一个具体的数值
七、数组的常见操作
数组的越界异常操作
public static void main(String[] args){
//动态初始化一个数组
int[] arr = new int [5];
System.out.println(arr[5]);
}
数组索引是从0开始,最大索引值是arr.length-1,数组索引的区间为[0,arr.length-1]。如果访问数组元素时,索引值不在该区间中,程序就会抛出数组索引越界异常。
数组空指针异常操作
public static void main(String[] args){
//动态初始化一个数组
int[] arr = new int[3];
arr = null;
//查看arr数组的第三个元素
System.out.println(arr[3]);
}
数组空指针异常,就是在程序运行过程中,有一个在内存当中不存在的一个变量被引用到了
八、数组遍历【重点】
数组遍历: 就是将数组中的每个元素分别取出来,这就是遍历。遍历是我们操作数组的核心和重点内容。
public static void main(String[] args){
//静态初始化数组
int[] arr = {1,2,3,4};
//数组遍历
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
}
上述代码就是数组的遍历,但是如果数组的长度很大。我们不可能会去一个一个打印,那样做不现实也太蠢了。我们知道数组的索引是从0开始,依次递增的,直到arr.length-1为止,我们是否能引入循环来完成数组的遍历呢?
public static void main(String[] args){
//静态初始化数组
int []arr={1,2,3,4};
//数组遍历 for或者while
for(int i=0;i<=arr.length-1;i++){
System.out.println(arr[i]);
}
}
获取数组当中的最大值
思路:
- 定义一个最大值变量,保存数组当中的第一个元素(数组当中索引值为0)
- 遍历数组,获取数组当中所有的元素
- 将遍历到的元素和保存的最大值变量进行比较
- 如果数组元素的值大于最大值变量,那么就把数组元素赋值给最大值变量
- 数组循环遍历结束,最大值变量保存的就是数组当中的最大值
public static void main(String[] args){
//静态初始化一个数组
int[] arr= {3000,200,1000,10000,5000};
//定义一个最大值变量
int max = arr[0];
for(int i = 1; i<=arr.length-1 ;i++){
if(arr[i]>max){
//如果数组元素的元素大于最大值变量,就把数组元素赋值给最大值变量
max = arr[i];
}
}
//数组遍历结束,最大值变量保存的就是数组当中的最大值
System.out.println("数组的最大值为:" + max);
}