- 什么是二维数组:在数组中存放数组
- 二维数组的应用场景:当我们需要把数据分组管理的时候,就需要用二维数组。
- 静态初始化格式:数据类型【】【】数组名 = new 数据类型【】【】{{元素1,元素2},{元素1,元素2}};
- 简化格式:数据类型【】【】数组名 = {{元素1,元素2},{元素1,元素2}};
- 注意:以后这样定义,把每一个一维数组,单独写成一行
- 每一个一维数组其实是二维数组中的元素,所以每一个一维数组之间需要用逗号隔开,最后一个一维数组后面不需要加逗号。
//例如
int【】【】 arr = {
{1,2,3},
{4,5,6,7,8}
};
- 动态初始化格式:数据类型【】【】数组名 = new 数据类型【m】【n】;
- m表示这个二维数组,可以存放m个一维数组
- n表示每一个一维数组,可以存放n个元素
- 例如:
int【】【】arr = new int【3】【5】;
//3:表示二维数组的长度为3,可以装3个一维数组
//5:表示每一个一维数组的长度都是5,可以装5个int类型的元素
arr【0】【0】 = 10;
//给二维数组赋值一个元素
//遍历二维数组
//外循环:遍历二维数组,获取里面的每一个一维数组
for (int i = 0;i<arr.length;i++){
//内循环:遍历一维数组,获取一维数组里的每一个元素
for (int j = 0;j<arr【i】.length;j++){
sout (arr【i】【j】+ “ ”);
}
sout ();
}
// 10 0 0 0 0
// 0 0 0 0 0
// 0 0 0 0 0
- 获取元素
对 arr【i】【j】来说
- arr:表示二维数组名,存储二维数组整体内存空间的地址
- i:二维数组的索引,获取出来的是一维数组
- j:一维数组的索引,获取出来的就是一维数组里的真正的元素。
//例如
int【】【】 arr = {
{1,2,3},
{4,5,6,7,8}
};
// sout (arr【0】) 表示打印二维数组中的第一个一维数组
// arr【0】【0】表示获取第一个一维数组中的0索引对应的元素
sout (arr【0】【0】);//1
sout (arr【1】【4】);//8
sout (arr【2】【0】);//ArrayIndexOutOfBoundsException,超出数组长度,越界了。
- 遍历
//例如
int【】【】 arr = {
{1,2,3},
{4,5,6,7,8}
};
//外循环:遍历一遍二维数组,得到里面的每一个一维数组
for (int i = 0;i<arr.length;i++){
//i:表示二维数组里的每一个索引,对应一个一维数组
//arr【i】: 表示二维数组中的每一个元素(一维数组)
//内循环:遍历一维数组,得到里面的每一个元素
for(int j=0;j<arr【i】.length;j++){
//j:表示一维数组中的每一个索引
//arr【i】【j】:表示真正的,一维数组里的元素。
sout (arr【i】【j】+“ “);
}
}
- 二维数组的内存图
- 程序会先根据arr【2】中的2,在堆内存中,申请一片空间,存放两个null值(地址值),并把这片空间的地址值给arr。
- 之后又会根据arr【2】【3】中的2和3,在堆内存中,再申请2片空间,每片空间存放3个0值(int类型默认值),并把这2片空间的地址值覆盖掉对应的null,即给arr【0】和arr【1】
- 两个特殊情况
- 不写二维数组后一个【】里的数字,表示不创建二维数组中对应的一维数组,只预留了对应地址值的空位(默认值为null),等手动创建好一维数组后,再将地址值填入即可。
- 好处:不用创建长度固定的一维数组,可以根据实际,灵活选择一维数组的长度。
- 用新一维数组的地址值覆盖掉原来二维数组中存储的一维数组的地址值。
- 会导致原来存储的一维数组没有用了,就会被作为垃圾回收掉