数组
一、数组定义格式:
1)数组概述:一次性声明大量的用于存储数据的变量;这些要存储的数据通常都是同类型数据。例如:全班同学的考试成绩。
2)数组:是一种用于存储多个相同类型数据的存储模型
3)定义格式1:
数据类型[] 变量名
范例:
int[] a ;
//含义:定义了一个int类型的数组,数组名是a;
4)定义格式2:
数据类型 变量名[]
范例:
int a[];
//含义:定义了一个int类型的变量,变量名是a数组;
二、数组动态初始化
1)数组初始化概述:Java中的数组必须先初始化,然后才能使用;初始化就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
2)数组初始化方式:动态初始化、静态初始化
3)动态初始化:指初始化时只指定数组长度,有系统为数组分配初始值
4)动态初始化格式:
数据类型[] 变量名 = new 数据类型[数组长度];
5)动态初始化代码演示:
public class Array{
public static void main(String[]args){
int[] arr = new int[3];
}
}
/*
左边:
int:说明数组中的元素是int类型;
[]:说明这是一个数组
arr:数组的名称
右边:
new:为数组申请内存空间
int:说明数组中的元素类型是int类型
[] :说明这是一个数组
3:数组长度,即数组中的元素个数
*/
三、数组元素访问
1)数组变量的访问方式: 数组名
2)数组内部保存的数据的访问方式: 数组名[索引] //编号从0开始
3)索引:索引是数组中数据的编号方式,作用就是用于访问数组中的数据,数组名[索引]等同于变量名,是一种特殊的变量名;索引从0开始,是连续的,逐一增加,每次加一
4)例子: System.out.println(arr[0]); //访问数组的第一个元素
四、内存分配
1)Java中内存分配:Java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式
2)数组在初始化时,会为存储空间添加默认值:整数默认值是0;浮点数默认值是0.0;布尔值的默认值是false;字符默认值是空字符;引用数据类型的默认值是null
3)内存索引示意图:
new的时候分配蓝色区域,执行输出语句时,利用红色区域的数组名指向的内存地址寻找到蓝色区域中的红色表。
4)上图中,红色区域为栈内存、蓝色区域为堆内存
5)栈内存:存储局部变量,即定义在方法中的变量,例如arr,使用完毕后立即消失
6)堆内存:存储new出来的内容(称为实体、对象)、数组在初始化时,会为存储空间添加默认值 ,每一个new出来的东西都有一个地址值,使用完毕后,会在垃圾回收器空闲时被回收。
7)多个数组的内存图
8)多个数组指向相同的内存图
把第一个数组的地址值赋给了第一个数组,也就是指向相同的内存
int[] arr2 = arr;
当两个数组指向相同时,其中一个数组修改堆内存的数据时,另一个数组访问时,也会取到修改后的堆内存的值
五、数组静态初始化
1)静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
2)格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3.....}
范例:
int[] arr = new int[]{1,2,3};
3)简化格式:
int[] 变量名 = {数据1,数据2,数据3......}
范例:
int[] arr = {1,2,3};
六、数组操作的两个常见小问题
1)索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题(ArrayIndexOutOfBoundsException)
2)空指针异常:访问了数组中不存在的索引对应的元素,造成索引越界问题(NullPointerException)
范例:
int[] arr = new int[3];
System.out.println(arr[2]);
//把null赋值给数组
arr = null;
//输出元素
System.out.println(arr[0]);
七、数组常见操作
1)遍历:
/
/利用for循环实现获取数据,索引0-4
for(int i = 0 ; i<4 ; i++){
System.out.println(arr[i]);
}
2)获取数组元素数量:数组名.length;例子:arr.length
数组遍历的通用格式:
int[] arr = {.....};
for(int x = 0; x<arr.length;x++){
System.out.println(arr[x]);
}
3)获取最值
int[] arr = {....};
int max = arr[0];
//定义一个变量,用于保存最大值(或最小值),取数组中第一个数据作为变量的初始值
for(int x = 1 ; x<arr.length ; x++){
//与数组中剩余的数据逐个比对
if(arr[x]>max){
max = arr[x];
}
}
System.out.println(max);