JAVA入门笔记4 —— 对比java和C/C++中数组的存储

  • 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇

1. 一维数组

(1)C/C++

  • 示例:int a[5];
    1. 这创建了一个int型数组,数组容量为5个int型数据

    2. C/C++中数组存储于栈区,由系统管理自动分配空间,所以定义数组时必须要指明大小

    3. 这里数组变量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
      */
      
    4. 从起始地址开始,每找出int尺寸空间,就解释为一个数组元素。存储图示如下
      在这里插入图片描述

(2)java

  • 示例:int[] a = new int[5];
    1. 类似C/C++中指针变量 + malloc建立动态数组

    2. 示例做了三件事

      1. 创建了一个int 数组变量a(在栈区)
      2. 创建了一个容量为5的int型一维数组(在堆区)
      3. 数组变量a赋引用
    3. 堆区的数组是连续存储的,但是a的地址不再是数组首地址了。a里存储的是一个对数组首地址的引用。如下
      在这里插入图片描述

    4. 注意,java中数组是一个引用类型,数组变量在栈区可以自动分配空间,但堆区的数组对象需要手动分配空间 (new出来) ,如果一个数组对象没有任何数组变量引用它,就会被jvm垃圾回收机制自动回收

2. 二维数组

(1)C/C++

  • 示例:int num[4][2];
    1. 这创建了一个int型二维数组,数组容量为4*2个int型数据
    2. C/C++中数组存储于栈区,由系统管理自动分配空间,所以定义数组时必须要指明大小
    3. 二维数组在存储空间中仍是线性排列,只是逻辑上进行列划分变量a本质上是一个指针,存储着(指向)数组所在的连续内存区的起始地址,如下
      在这里插入图片描述

(2)java

  • 示例:int[][] a = new int[4][5];
    1. 类似于C/C++中使用数组指针 + malloc建立动态二维数组
    2. 示例做了三件事
      1. 创建了二维数组变量a(在栈区)
      2. 创建尺寸4*5的int型二维数组(在堆区):先创建长4的 “引用一维数组”,再创建4个长5的int一维数组,分别引用过去
      3. 给数组变量a赋引用:引用到长4的 “引用一维数组”
    3. java中二维数组本质上是一个每个元素都是一个一维数组的数组,如下
      在这里插入图片描述
    4. 和java一维数组类似,在栈区只有一个数组变量,所有数组对象都在堆区,需要手动new创建
    5. 二维数组是在连续的地址上存储一维数组的引用地址,一维数组与一维数组并不一定靠在一起,但是这些一维数组内部的值是在连续地址上的。更高维的数组继续以此类推,只有最后一维数组在连续地址上保存值,其他纬度均在连续地址上保存下一维度的引用地址
    6. C/C++的多维数组是线性存储逻辑划分的;而java多维数组在存储上是有物理行列划分的,因此可以建立每行长度不等的二维数组(N维数组),C/C++中只能通过手动分配空间建立动态数组实现类似的效果

猜你喜欢

转载自blog.csdn.net/wxc971231/article/details/108644643
今日推荐