Java数组在内存中是如何存放的

阅读目录

Java中有两种类型的数组:

  • 基本数据类型数组;
  • 对象数组;

当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说也是一样的,因为数组也是一个对象;

一维数组

int[] arr = new int[3];

在以上代码中,arr变量存放了数组对象的引用;如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回其引用;

二维数组

那么二维数组是如何存储的呢?事实上,在Java中只有一维数组,二维数组是一个存放了数组的数组,如下代码及示意图:

int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];

对于多维数组来说,道理是一样的;

数组对象及其引用存放在内存中的哪里?

在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;

正如我们都知道的,java运行时数据区包括堆,JVM栈和其它。如下代码是一个小例子,那么就让我们来看看数组和它的引用在内存中是如何存放的.

class A {
    int x;
    int y;
}
...
public void m1() {
    int i = 0;
    m2();
}
public void m2() {
     A a = new A();
}
...

如上代码,让我们来调用方法m1,看看发生了什么:

当m1被调用的时候,栈帧Frame-1被创建并push到栈中,同时局部变量i也在栈帧Frame-1内创建。

然后,m2方法在m1方法内部被调用,栈帧Frame-2被创建并push到栈中,在m2方法中,一个新的对象A在堆中被创建,而它的引用则被put到栈帧Frame-2里;

现在内存中堆和栈的大致情况如下图:

数组同样是对象,所以数组和对象以及引用在内存中的分布如上所示;

译文链接:http://www.programcreek.com/2013/04/what-does-a-java-array-look-like-in-memory/

时间: 2024-12-28 10:25:02

Java数组在内存中是如何存放的的相关文章

Java千百问_06数据结构(016)_引用类型数组在内存中如何储存

点击进入_更多_Java千百问 1.存放基本类型数组在内存中如何储存 java的数组中可以存放引用类型. 存放引用类型的内存分布相比存放基本类型相对复杂.来看一段存储基本类型的程序: 了解什么是数组看这里:java中的数组是什么 了解数组在内存中的储存看这里:java数组如何存储在内存中 public class TestPrimitiveArray { public static void main(String[] args) { //1.定义数组 int[] numbers; //2.分配

Java中数组在内存中的图解

Java中的数组在内存中的图解,其实对于数组,还是比较熟悉的,平时用的也是很多的,在看数据结构与算法的极客时间专栏,最常用的10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie树,其中数组是最基础,也是学起来最简单的一种数据结构,数组是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. 以下三张图片都是极客时间专栏中的,嘿嘿嘿!!! 数组是计算机分配的一组连续的内存空间 接下来,具体到Java语言,来说说数组吧:(这个是传智播客上的讲解图,这么好的

C++数组在内存中的分配

接前一篇的内容,C++中数组在内存中也有静态分配和动态分配的区别.静态数组建立的方式为:A a[],它在栈上分配空间;动态方式是使用new,malloc在堆上分配. 数组要么在静态存储区被创建(如全局数组),要么在栈或堆上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变.看下例: 1 #include<iostream> 2 using namespace std; 3 void test() 4 { 5 char ch[]="hel

Java对象在内存中的存储

Java对象在内存中的存储分3块区域 1.对象头(Header) 2.实例数据(Instance Data) 3.对齐填充(Padding) 一.对象头 哈希码.GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳 类型指针 二.实例数据 各种类型的字段(父类继承下来的.子类自身定义的) 相同宽度的字段会被分配到一起 三.对齐填充 没有特别含义,仅仅起着占位符的作用(8字节的整数倍)

Java数组与内存控制

一.Java数组初始化 Java数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java数组使用之前必须先对数组对象进行初始化,所谓初始化,就是为数组的所有元素分配内存空间,并为每个数组元素指定初始值.(文章来源于李刚老师的<突破java程序员的16课>) 1:基本类型数组的两种初始化方式 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度. 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值. 不要同时使用静态初始化和动态初始化,也就是

记一次对java对象在内存中的分析

java 对象 占内存大小 计算方式 及 常用类型的占用 HotSpot的对齐方式为8字节对齐 ----计算公式:(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8 Hotspot 机 中 普通对象32位 对象头 占 8个字节 引用类型 占 4字节64位 对象头 占 16个字节 引用类型 占 8字节 64位中 空对象数组 对象头 占 24 增加一个长度 增加 一个引用类型的长度 64位中是 8空的基本数据类型数组 对象头 占 24 增加一个长度 增加一

JAVA变量在内存中的分配

变量是程序中最基本的存储单元,从本质上讲,变量其实是内存中的一小块区域.所以要为其分配一定的存储空间. 变量的类型 按数据类型: 基本数据类型 引用数据类型 按声明的位置: 局部变量 成员变量 程序在计算机内存的分布: 栈区: 由编译器自动分配释放,主要存放Java程序运行时所需的局部变量.方法的参数.对象的引用以及中间运算结果等数据.其操作方式类似于数据结构的栈. 堆区: 不是系统为程序自动分配的,是程序执行过程中有new语句为变量分配的,主要存放Java程序运行时创建的所有引用类型,即使指向

数组在内存中的解释

1 public class Array_Memory { 2 public static void main(String[] args) { 3 int[] a = {3,4,66,5};//定义了一个数组 4 5 int[] b = a;//将a这个数组的地址值赋给了b,a和b就好像公用了以台电脑 6 b[2] = 77;//b把一角标的值该为77: 7 a = null;//a不再指向该数组,但是b还在指向该数组,就好像a不用这台电脑了但b还再用,所以内存中没有垃圾,因为数组还有人在使用

C# 数组在内存中的存储

C# 数组是引用类型,那么在内存中是如何存储的呢? 在VS中调试C#程序,如何查看内存.寄存器.反汇编 在这篇文章里看到了如何在VS 中查看内存 先断点打在数组创建后语句那里,点debug->Windows->Memory, 选一个随便memory 在immediate window里 输入 &变量名 arr,获取arr的内存地址. &arr0x009becd8  ----->在堆栈中引用地址 *&arr: 0x02d75cb4  ----->在托管堆中空间