1.数组
数组是一组数据类型相同的数据的组合,将这些数据统一的管理起来。
数组本身是一个引用数据类型,数组内存储的类型可以是基本类型,也可以是引用类型。
- 数组本身是一个引用数组类型
- 数组是在堆内存中的一串连续的地址存在
- 数组在初始化是必须指定长度
- 堆内存中的数组空间长度一旦确定,不能再次发生改变
- 栈内存的变量中存储的是数组的地址引用
数组的分类:
按照维度:一维数组、二维数组、三维数组、…
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对 象数组)
2. 一维数组
数组的定义
数据类型[] 数据名字;
int[] x;
char[] y;
boolean[] z;
String[] m;
数组的初始化
静态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行。
//有长度 有元素
int[] arrray1 = new int[]{1,2,3,4,5};
int[] array2 = {1,2,3,4,5,6};
动态初始化:在定义数组的同时就为数组元素分配空间并赋值。
//有长度 没有元素(不是真的没有,有默认值)
int[] array = new int[5];
数组元素类型 | 元素默认初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
doube | 0.0 |
char | 0 或写为:‘\u0000’(表现为空) |
boolean | false |
引用类型 | null |
数组的访问
通过元素在数组中的位置来访问
数组的索引的取值范围 [0–length - 1]
如果数组的索引超出了范围,会出现一个运行时异常ArrayIndexBoundsOfException
int[] array = new int[]{1,2,3,4,,5,6,7,8,9,10};
a[0] = 10;
a[2] = 30;
a[10] = 0;//报错ArrayIndexBoundsOfException
数组的遍历(轮询)
通过循环的方式访问数组中的每一个元素
//第一种遍历方式
int[] array = {1,2,3,4,5,6,7,8,9,10}
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
//第二种遍历方式
int[] array = {1,2,3,4,5,6,7,8,9,10}
for(int value:array){
System.out.println(value);
}
一维数组的内存解析
3. 多维数组
二维数组
对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。
定义:
数据类型[][] 数组名字;
int[][] array;
初始化
静态初始化:
//有长度 有元素
int[][] arrray1 = new int[][]{{1,2},{3,4,5},{6,7,8,9}};
int[][] array2 = {{1,2},{3,4},{6,7}};
定义一个名称为array1的二维数组,二维数组中有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组 arr[0] = {1,2};
第二个一维数组 arr[1] = {3,4,5};
第三个一维数组 arr[2] = {6,7,8,9};
第三个一维数组的长度表示方式:arr[2].length;
- 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
- Java中多维数组不必都是规则矩阵形式
动态初始化:
//有长度 没有元素(不是真的没有,有默认值)
int[][] array = new int[2][3];
定义了名称为arr的二维数组
二维数组中有2个一维数组
每一个一维数组中有3个元素
一维数组的名称分别为arr[0], arr[1]
给第一个一维数组的第二个元素赋值:array[0][1] = 64;
int[][] array = new int[3][];
二维数组中有3个一维数组。
每个一维数组都是默认初始化值null
可以对这个三个一维数组分别进行初始化
array[0] = new int[3]; array[1] = new int[1]; array[2] = new int[2];
注:
int[][] array = new int[][3]; //非法
二维数组的内存解析