(文章翻译自What does a Java array look like in memory?)
Java中的数组存储了两个中的一个类型:原始类型的类或则是引用类型(比如指针)
当一个对象通过New
创建的 时候,将会在堆内存分配空间并且返回了引用。因为数组也是对象所以这个对数组来说也是适用的。
1.一维数组
int arr[] = new int[3];
int[] arr只是拥有三个整形对象的数组的引用。如果你你创建了一个拥有十个对象的数组,也是相同的方式数组被创建然后返回一个引用。
2.二维数组
那么二维数组是怎么样的呢?实际上在Java中我们只会有一维数组,二维数组只是一维数组的一维数组。
int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4]
多维数组也是适用相同的规则。
3.在内存中他们位于什么地方?
在Java中数组也是对象,所以一个对象怎么表示也适用于一个数组。
我们知道JVM运行时数据区包括堆、JVM栈和其他的。下面一个简单的 例子,让我们看看数组和它的应用在哪地方存储的。
class A {
int x;
int y;
}
...
public void m1() {
int i = 0;
m2();
}
public void m2() {
A a = new A();
}
...
在上面的声明中我们调用m1()并且看看将会发生什么:
1.当m1被调用的时候,一个新的帧(Frame-1)被放到了栈中,而且局部变量也被创建在(Frame-1)中。
2.然后m2在m1内部被调用,另外一个新的帧(Frame-2)被放到了栈中。在m2中,一个对象A被创建在堆中而且引用变量被放到了(Frame-2) 中。现在,在这个点上,栈和堆像下面一样:
数组和和对象一样被同样的方式对待,所以为什么在内存中分配是直接的。
[译]内存中的Java数组是怎么样的的更多相关文章
-
危险代码:如何使用Unsafe操作内存中的Java类和对象
危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...
-
[译]在运行时内存中的Java对象是怎么样的
(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...
-
java——内存中的数组
数组是一种引用类型,数组引用变量只是一个引用,数组元素和数组变量在内存中时分开存放的,下面我们看一下基本类型的数组和引用类型的数组在内存中的地址分布情况 基本类型数组: 我们先来看一段代码: publ ...
-
Java数组及其内存分配
几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...
-
java中的各种数据类型在内存中存储的方式
原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...
-
Java的各类型数据在内存中分配情况详解
1. 有这样一种说法,如今争锋于IT战场的两大*,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大*各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ...
-
java 数组变量与数组对象
数组是否必须初始化 对于这个问题,关键在于要弄清楚数组变量和数组对象的差别.数组变量是存放在栈内存中的,数组对象是存放在堆内存中的.数组变量只是一个引用变量,他能够指向实际的数组对象. 所谓的数组初始 ...
-
Java开发知识之Java数组
Java开发知识之Java数组 一丶数组简介 首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构 在Java中数组可以 ...
-
java数组变量
数组变量是一种引用类型的变量,能够指向数组对象.数组对象存储在堆内存中,当数组变量为局部变量时存储在栈内存中. int[] p = new int[]{5, 6, 7, 8, 9}; p是数组变量,指 ...
随机推荐
-
PostGr-SQL database创建表
postgres=# create database vertigo_sandbox; postgres=# \connect vertigo_sandbox vertigo_sandbox=# CR ...
-
SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...
-
如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]
在网上搜资料,自己在本地虚拟机上尝试搭建,弄了整整一天一夜,终于弄好了.网上的资料,虽然很多,但大多都是重复的,拿去试了之后,又很多都不能得到正确的结果.最终找到了适合我的linux环境的搭建方式;在 ...
-
./jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory
Ubuntu 上使用jad,出现上面错误: ./jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot ...
-
eclipse能够自动提示变量名.
打开 Eclipse -> Window -> Perferences -> Java -> Editor -> Content Assist,在右边最下面一栏找到 au ...
-
Asp.Net统一前后端提示信息方案
Asp.Net统一前后端提示信息方案 目录 要解决的问题 自定义XML 前端弹框的实现 后端弹框的实现 扩展和整合 示例代码(不完整)及示例截图 示例下载 要解决的问题 减少弹框前后端代码量 增强 ...
-
java基础:简单实现线程池
前段时间自己研究了下线程池的实现原理,通过一些源码对比,发现其实核心的东西不难,于是抽丝剥茧,决定自己实现一个简单线程池,当自已实现了出一个线程池后.发现原来那么高大上的东西也可以这么简单. 先上原理 ...
-
PHP中如何调试?
比如有个数组: $arr = array('A' => 'bobi','B' => 'hehe'); echo $arr; //Array 只打印出了变量 ...
-
oracle 11.2.0.2以后对数据库用户名重命名
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn [转自]http://www.xifenfei.com/2012/0 ...
-
Nginx子域名配置
extends:http://blog.csdn.net/xiaoping0915/article/details/53899465 ,http://www.myhack58.com/Article/ ...