Java基础语法06-数组
数组定义格式
数组概述
- 一次性声明大量的用于存储数据的变量
- 要存储的数据通常都是同类型数据,例如:考试成绩
数组的定义格式
-
格式一:数据类型[] 变量名
-
范例: int[] arr
-
定义了一个int类型的数组,数组名是arr
-
格式二:数据类型 变量名[]
-
范例: int arr[]
-
定义了一个int类型的变量,变量名是arr数组
尽量使用格式一。
数组初始化之动态初始化
数组初始化概述
java中的数组必须先初始化,然后才能使用
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
数组初始化方式
- 动态初始化
- 静态初始化
动态初始化
初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名=new 数据类型[数组长度];
范例:int[] arr = new int[3];
/**
* 数组动态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
/*
* 左边
* int:说明数组中的元素类型时int类型
* []:说明这是一个数组
* arr:这就是变量名称
* 右边
* new:为数组申请内存空间
* int:说明数组中的元素类型时int类型
* 3:数组长度,其实就是数组中的元素个数
* */
}
}
数组元素访问
数组元素访问
数组变量访问方式
格式:数组名
数组内部保存的数据的访问方式
格式:数组名[索引]
索引是数组中数据的编号方式
作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名
- 索引从0开始
- 索引是连续的
- 索引逐一增加,每次加1
尝试输出数组本身:
/**
* 数组动态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);
}
}
输出结果:
直接输出数组会输出数组的地址信息
尝试访问数组中的元素:
/**
* 数组动态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr); //[I@16b98e56 这是分配的地址
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
输出结果:
三个都为0是因为动态初始化由系统分配了初始值
内存分配
Java中内存分配
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一篇区域都有特定的处理数据方式和内存管理方式。
栈内存:存储局部变量
定义在方法中的变量,例如:arr
使用完毕,立即消失
堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
每一个new出来的东西都有一个地址值
使用完毕,会在垃圾回收器空闲时被回收
当两个数组指向相同的数据时,一个修改,另一个也会修改。
代码:
/**
* 数组动态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr); //[I@16b98e56 这是分配的地址
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//给数组中的元素赋值
arr[0]=110;
arr[2]=119;
int[] arr2 = arr;
arr2[1] = 120;
System.out.println(arr); //[I@16b98e56 这是分配的地址
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
运行结果:
数组初始化之静态初始化
数组初始化之静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,……};
范例:int[] arr = new int[]{1,2,3};
简化格式:数据类型[] 变量名 = {数据1,数据2,数据3,……};
范例:int[] arr = {1,2,3};
代码测试:
/**
* 数组静态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr={1,2,3};
System.out.println(arr);
for(int i=0;i<3;i++){
System.out.println(arr[i]);
}
}
}
运行结果:
数组操作的两个常见小问题
索引越界
例:
int[] arr = new int[3];
System.out.println(arr[3]);
数组长度为3,则最大索引为2,寻找索引3则会报错。
访问了数组中不存在的索引对应的元素,造成索引越界的问题。
空指针异常
int[] arr = new int[3];
System.out.println(arr[2]);
arr = null;
System.out.println(arr[2]);
arr = null将数组的地址索引置空了,访问的数组不再指向堆内存的数据,造成空指针异常。
null:控制,引用数据类型的默认值,表示不指向任何有效对象。
数组常见操作
遍历
获取数组元素数量:arr.length
代码测试:
/**
* 数组静态初始化
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr={1,2,3};
System.out.println(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
运行结果:
获取最值
- 定义一个变量,用于保存最大值或最小值
- 取数组中第一个数据作为变量初始值
- 遍历数组,将变量与每一个元素对比,如果该元素大于或者小于变量,则保存其元素的值
测试代码:
/**
* 数组求最大值
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr={1,2,3,6,8,7,4,5};
int maxValue=arr[0];
System.out.println(arr);
for(int i=1;i<arr.length;i++){
if(maxValue<arr[i]){
maxValue=arr[i];
}
}
System.out.println("数组中的最大值是:"+maxValue);
}
}
输出结果: