- 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇
1. 一维数组
(1)C/C++
- 示例:
int a[5];
-
这创建了一个int型数组,数组容量为5个int型数据
-
C/C++中数组存储于栈区,由系统管理自动分配空间,所以定义数组时必须要指明大小
-
这里数组变量a本质上是一个指针,存储着(指向)数组所在的连续内存区的起始地址,如下可验证
#include<iostream> using namespace std; int main() { int a[5] = { 1,2,3,4,5}; cout<<a<<endl; for(int i=0;i<5;i++) cout<<&a[i]<<" "<<a[i]<<endl; return 0; } /* 0x70fdf0 0x70fdf0 1 0x70fdf4 2 0x70fdf8 3 0x70fdfc 4 0x70fe00 5 */
-
从起始地址开始,每找出int尺寸空间,就解释为一个数组元素。存储图示如下
-
(2)java
- 示例:
int[] a = new int[5];
-
类似C/C++中指针变量 +
malloc
建立动态数组 -
示例做了三件事
- 创建了一个int 数组变量a(在栈区)
- 创建了一个容量为5的int型一维数组(在堆区)
- 给数组变量a赋引用
-
堆区的数组是连续存储的,但是a的地址不再是数组首地址了。a里存储的是一个对数组首地址的引用。如下
-
注意,java中数组是一个引用类型,数组变量在栈区可以自动分配空间,但堆区的数组对象需要手动分配空间 (
new
出来) ,如果一个数组对象没有任何数组变量引用它,就会被jvm垃圾回收机制自动回收
-
2. 二维数组
(1)C/C++
- 示例:
int num[4][2];
- 这创建了一个int型二维数组,数组容量为4*2个int型数据
- C/C++中数组存储于栈区,由系统管理自动分配空间,所以定义数组时必须要指明大小
- 二维数组在存储空间中仍是线性排列,只是逻辑上进行列划分,变量a本质上是一个指针,存储着(指向)数组所在的连续内存区的起始地址,如下
(2)java
- 示例:
int[][] a = new int[4][5];
- 类似于C/C++中使用数组指针 +
malloc
建立动态二维数组 - 示例做了三件事
- 创建了二维数组变量a(在栈区)
- 创建尺寸4*5的int型二维数组(在堆区):先创建长4的 “引用一维数组”,再创建4个长5的int一维数组,分别引用过去
- 给数组变量a赋引用:引用到长4的 “引用一维数组”
- java中二维数组本质上是一个每个元素都是一个一维数组的数组,如下
- 和java一维数组类似,在栈区只有一个数组变量,所有数组对象都在堆区,需要手动
new
创建 - 二维数组是在连续的地址上存储一维数组的引用地址,一维数组与一维数组并不一定靠在一起,但是这些一维数组内部的值是在连续地址上的。更高维的数组继续以此类推,只有最后一维数组在连续地址上保存值,其他纬度均在连续地址上保存下一维度的引用地址
- C/C++的多维数组是线性存储逻辑划分的;而java多维数组在存储上是有物理行列划分的,因此可以建立每行长度不等的二维数组(N维数组),C/C++中只能通过手动分配空间建立动态数组实现类似的效果
- 类似于C/C++中使用数组指针 +