数组与其内存分配情况

来源:互联网 发布:c语言中n的阶乘 编辑:程序博客网 时间:2024/05/17 03:19

  • 数组与其内存分配情况
    • 数组的初始化
      • Java数组是静态的
      • 数组一定要初始化吗
      • 基本类型数组初始化
      • 引用类型数组初始化
    • 使用数组
      • 数组元素就是变量
      • 没有多维数组

数组与其内存分配情况

  • 数组的初始化
  • 使用数组

数组的初始化

  • Java数组是静态的
  • 数组一定要初始化吗
  • 基本类型数组初始化
  • 引用类型数组初始化

Java数组是静态的

java数组是静态的. 这句话是什么意思呢?
编程语言, 根据语言是否是动态或静态的, 可以分为 2 种:
第一种: 动态类型语言. 动态类型语言是指, 在变量进行声明赋值时, 不需要声明变量类型, 具体的变量类型是在程序运行时, 根据变量的值, 动态获取变量的类型. 例如: JavaScript语言、Python语言都是动态类型语言.
第二种: 静态类型语言. 静态类型语言是指, 在变量声明时, 必须要进行类型声明, 不然编译运行时会报错. 例如: C语言, Java.

那么, Java数组是静态的, 这是什么意思呢?
做个比较, 大家就能理解了.
JS中, 定义数组是这么定义的.

var array1 = [];array1[0] = 1;array1[9] = 10;

JS中, 定义数组后, 可以改变数组的长度

Java中, 定义数组的代码如下:

int[] a = new int[]{1,2,3};

Java中的数组, 一旦声明定义好了, 其长度是不可更改的.
这就是为什么说, Java中的数组是静态的了!!! ^V^..

数组一定要初始化吗

当然要初始化了. 简直懒得和小编废话:)
那么, 问题来了. 数组初始化的步骤分为几步?数组的初始化的实质是什么?
第一个问题: 数组初始化的步骤分为几步?
小编认为, 数组的初始化分为 3 步.
第一步: 创建数组变量
第二步: 创建数组对象, 初始化数组对象
第三步: 为数组变量赋值数组对象
例如: int[] a = new int[5];
首先, 在栈中, 创建一个数组变量a;
其次, 在堆内存中, 创建一个数组对象, 虚拟机为赋初始化值: 0
最后, 将数组对象的引用赋值给数组变量a.

从上面可以发现, 数组初始化本质, 也可以说, 变量初始化的本质 就是:
创建变量, 创建变量值或变量对象, 为变量赋值

基本类型数组初始化

同上(数组一定要初始化吗?), 小编就不在写一遍了 :) .

引用类型数组初始化

引用类型数组初始化步骤与基本类型数组初始化步骤相同.
其中的区别, 就是数组元素的类型不同.
基本数据类型数组元素的类型, 是 基本类型
引用类型数组元素的类型, 是 引用类型. 在堆内存中, 就是 引用数组元素 引用了一个 对象(和C中的指针差不多).

使用数组

  • 数组元素就是变量
  • 没有多维数组

数组元素就是变量

数组元素就是变量.
举个例子说明吧.
例如: int[] a = new int[6];
大家应该都知道访问数组元素的语法哈. 数组变量名[下标];
例如: a[4] 就代表了数组元素;
其实可以这么理解, a[4]是 在内存中的一个地址.
地址中的内容是可以随时改变的.
a[4]=5; 就是, 将 5 这个值放到a[4]代表的地址中. 当然你也可以为其赋值为: 11, 12… 等等! :)

没有多维数组

在Java中是没有多维数组概念的(这一点和C语言不同)
在Java中所有的数组都可以认为是 一维数组.
比如:
int[] a = new int[5]; 这是一维数组
int[][] b = new int[5][]; 这也是一维数组.
那小编开始疑惑了?
数组 b 明明是二维数组, 为什么老师说是一维数组呢? [心理活动]”老师我读书少, 您别骗我! :)”
其实, 在堆内存中, b 仍然是一个一维数组, 且数组的长度是5. (你可以想象成 b是一条直线段, 共有5个端点, 每个端点对应着数组的每个元素)
不过, 数组 b 中的每一个元素的类型: 也是一个整型数组: int[];
可以这么理解:
b 是一条有五个端点的直线段, 而每个数组元素指向的数组, 以5个端点为起点,做b这条直线段 固定长度的垂线, b的每个数组元素, b[0], b[1]…又是一个数组, 垂线的长度,就是 b的每个数组元素引用数组的长度.

欢迎大家访问小编的博客, 有问题或者觉得小编理解不对的, 可以在下面评论留言哦.大家一起学习哈! (^__^) 嘻嘻……

原创粉丝点击