数组概述
数组是存储多个变量(元素)的容器
这多个变量的数据类型要一致
数组定义格式
格式一:
// 数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
int[] arr = new int[5];
格式二:
// 数据类型[] 数组名 = {元素值1,元素值2,元素值3,...};
int[] arr = {20,5,100,30,5}
还有其他格式如下:
int[] arr = new int[]{20,5,100,30,5}
int arr[] = new int[4];
数组元素的访问
数组元素的访问 指的是对数组元素的赋值和取值
访问格式:
数组名[索引]
数组中的每个元素都是有编号的这个编号就叫索引,也称作角标或者下标,编号是从0开始的,最大的编号就是数组的 长度-1
比如想给arr数组的第一个元素赋值一个数字100 , 可以使用
arr[0] = 100;
想打印arr数组的第一个元素 可以使用
System.out.println(arr[0]);
数组内存图与数据存储原理
Java中的内存分配
Java 程序在运行时,需要在内存中的分配空间。
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
- 栈 存储局部变量
局部变量是定义在方法中或者语句中的变量
局部变量使用完毕,立即回收 - 堆 存储new出来的东西
- 每一个对象都有首地址值,是一个十六进制的地址
- 每一个对象内的数据都有默认值
byte,short,int,long 0
float,double 0.0
char ‘\u0000’,一个空格
boolean false
引用类型:null - 使用完毕后,会被垃圾回收器空闲的时候回收。
- 其他区域
方法区 (存放字节码文件,常量等)
本地方法区(系统使用)
寄存器(给CPU使用)
数组的内存示意图
数组遍历
遍历数组是最常见的操作,即依次访问数组中每个元素。使用数组名.length可以获取数组长度,配合循环可以完成遍历动作。
遍历数组代码如下:
int[] arr = {213,4,2,6,10,8};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for(int a:arr){
System.out.println(a)
}
数组操作的两个问题
在使用数组时,因为不当的操作,我们可能会通过编译,但是在运行期间遇到一些程序报错,称为运行时错误。
数组最常见的两个运行时错误:空指针异常和数组索引越界异常
空指针异常
NullPointerException空指针异常
主要是两种情况:
- 变量完全没有值
- 变量有值,但值为null
数组索引越界异常
ArrayIndexOutOfBoundsException 数组索引越界
当数组中不存在该索引却访问该索引时,运行时报错
二维数组
元素仍为数组
数组可以存储任意类型的数据,但是一个数组只能存储一种数据类型的数据。当数组中存储的元素类型仍然为数组时,该数组称为二维数组。
好比大盒子套小盒子,真正的元素存在于盒子中的盒子中。
二维数组基本使用
数组创建
第一种方式创建(内外数组均创建并赋值)
// 数据类型[][] 数组名 = {{元素值1,元素值2,...},{元素值1,元素值2,..},...}
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
上面的二维数组中定义了三个元素,这三个元素都是数组,分别为{1,2}、{3,4,5,6}、{7,8,9},接下来通过一个图来表示这种情况
二维数组定义方式较多,原则是创建多个数组,将多个数组放置到一个数组中。
元素访问
对二维数组中元素的访问也是通过索引的方式
如需找到二维数组中第二个一维数组,具体代码如下:
int[] arr2 = arr[1]; //访问的为二维数组中第2个一维数组
int i = arr2[2]; //访问第2个一维数组中第3个元素
System.out.println(i); //打印结果5
如需找到二维数组中第一个元素数组的第二个元素,具体代码如下:
int j = arr[0][1]; //访问的为二维数组中第1个一维数组的第2个元素
System.out.println(j); //打印结果为2
二维数组遍历
public class MyTest {
public static void main(String[] args) {
// 定义二维数组
int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
// 遍历二维数组
for(int y=0; y<arr.length; y++) {
for (int x = 0; x < arr[y].length; x++) {
System.out.print(arr[y][x] + " ");
}
System.out.println();//换行
}
}
}
//打印结果为
1 2 3
4 5 6
7 8 9
二维数组其他定义格式
第二种方式(内外数组均创建)
数据类型[][] 数组名 = new 数据类型[M][N];
int[][] arr = new int[3][4];
上面的代码相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组,如下图所示。
第三种方式(只创建外数组,了解)
int[][] arr = new int[3][];
内数组中每个元素的长度不确定,如下图所示。