二维数组
一、定义
int[][] array = {
{11, 12, 13, 14, 15},
{21, 22, 23, 24, 25},
{31, 32, 33, 34, 35}
};
本质 : 数组里面存数组, int[ ][ ] ,每一个元素是一个一维数组
1. 初始化
// 方式一 : 静态初始化
int[][] arr = {{1,2},{3,4,5},{6}};
// 简写
int arr[][] = {{1,2},{3,4,5},{6}};
// 方式二 : 动态初始化
int[][] arr = new int[3][2]; // 全部默认值为 0
// 方式三 : 只指定行数, 不指定列数
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int
2. 获取长度
array.length; //获取行数 : 3
array[0].length; //获取第0行的列数 : 5
array[1].length; //获取第1行的列数 : 5
3. 遍历二维数组
// 普通for循环
// 外层 i, 内层 j
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[0].length ; j++){
System.out.println(array[i][j]);
}
}
// 外层 j, 内层 i
for(int j = 0; j < array[0].length; j++){
for(int i = 0; i < array.length; i++){
System.out.println(array[i][j]);
}
}
//------------------------------------------------------
// 增强for
for(int[] row : array){
for(int num : row){
System.out.println(num);
}
}
4. 内存图

局部性原理(空间局部性)
- cpu 读取内存(速度慢)数据后,会将其放入高速缓存(速度快)当中,如果后来的计算再用到此数据,再缓存中能读到的话,就不必读内存了
- 缓存的最小存储单位是缓存行(cache line),一般64bytes,一次读取的数据少了不划算,因此最少读 64 bytes 填满一个缓存行,因此读入某个数据时也会读取其临近的数据,这就是所谓空间局部性
5. 普通for遍历的俩种方式对比
-
外层 j , 内层 i
每次把一整行数据加载进缓存,但是只用到一个数据块,其余的数据还没有被用到的时候,再缓存空间不足时就被别的数据行覆盖了,还要再去访问内存,浪费太多时间了
-
外层 i , 内层 j
每次把一整行数据加载进缓存,下一次还需要用到这一次加载进来的数据,大大减少了读取时间,提高了效率
🚨 提示
因此我们一般使用外层 i , 内层 j 的普通for遍历
116

被折叠的 条评论
为什么被折叠?



