数组定义和访问
容器概念
容器:是将多个数据存储到一起,每个数据称为该容器的元素。
生活中的容器:水杯,衣柜,教室等。
数组概念
数组:存储数据长度固定的容器,保证多个数据数据类型要一致。
数组是最基本的一种数据结构。
数组定义
格式1
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[⻓度];
举例
//定义存储3个整数的容器
int[] arr = new int[3];
数组有定长特性,长度一旦指定,不可更改。
格式2
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...};
举例
//定义存储整数1,2,3,4,5的数组容器
int[] arr = new int[] {1, 2, 3, 4, 5
格式3
数据类型[] 数组名 = {元素1, 元素2, 元素3...};
举例
int[] arr = {1, 2, 3, 4, 5};
数组的访问
索引:每一个存储到数组的元素,都会自动拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组索引访问到数组中的元素。
格式
数组名[索引]
数组的长度:每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度。语句为:数组名.length。
示例
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5};
// 打印数组的属性,输出结果是5
System.out.println(arr.length);
}
索引最大值:length-1
索引访问数组中的元素
//数组名[索引]=数值,为数组中的元素赋值
//变量=数组名[索引],获取出数组中的元素
public 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虚拟机要运行程序,需要对内存空间进行分配和管理。
JVM内存划分
区域名称 | 作用 |
---|---|
寄存器 | CPU使用 |
本地方法栈 | JVM使用操作系统功能的时候使用 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或数组,new来创建的,都存储在堆内存 |
H | 方法运行时使用的内存,比如main方法运行 |
数组在内存的存储
一个数组的内存图
两个数组的内存图
两个变量指向同一个数组
示例代码
public static void main(String[] args) {
// 定义数组,存储3个元素
int[] arr = new int[3];
// 数组索引进⾏赋值
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
// 输出3个索引上的元素值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 定义数组变量arr2,将arr的地址赋值给arr2
int[] arr2 = arr;
arr2[1] = 9;
System.out.println(arr[1]);
}
内存图
数组常见操作
数组越界异常
示例代码
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
由程序可知,数组索引最大值为2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后会抛出ArrayIndexOutOfBoundsException数组越界异常。
空指针异常
示例代码
public static void main(String[] args) {
int[] arr = {1, 2, 3};
arr = null;
System.out.println(arr[0]);
}
arr=null意味着arr将不会再保存数组的内存地址,也就不允许操作数组了。因此运行时会抛出NullPointerException空指针异常。
空指针异常再内存图中的表现
数组遍历
数组遍历:将数组中每个元素分别获取出来。
可以使用循环,数组的索引是0到length-1,作为循环的条件。
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
获取数组最大值元素
实现思路:
1.定义变量,保存数组0索引上的元素。
2.遍历数组,获取数组中的每个元素。
3.将遍历到的元素和保存数组0索引的值比较。
4.如果数组元素大于变量的值,变量记住新的元素。
5.遍历结束,变量保存的就是数组的最大值。
示例代码:
public static void main(String[] args) {
int[] arr = {5, 15, 2000, 10000, 100, 4000};
// 定义变量,保存数组中0索引的元素
int max = arr[0];
// 遍历数组,取出每个元素
for (int i = 0; i < arr.length; i++) {
// 遍历到的元素和变量max⽐较
// 如果数组元素⼤于max
if (arr[i] > max) {
// max记录住⼤值
max = arr[i];
}
}
System.out.println("数组最⼤值是: " + max);
}
数组反转
示例代码
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
/*
* 循环中定义变量min=0最⼩索引
* max = arr.length ‐ 1最⼤索引
* min++, max‐‐
*/
for (int min = 0, max = arr.length ‐ 1; min <= max; min++, max‐‐) {
// 利⽤第三⽅变量完成数组中的元素交换
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反转后,遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}