Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java数组在内存中是如何存放的

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

作者头像
田维常
发布于 2020-04-21 09:55:24
发布于 2020-04-21 09:55:24
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

Java中有两种类型的数组:

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

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

一维数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] arr = new int[3];

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

二维数组

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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里;

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
YbtOJ 794「cdq 分治 整体二分」奇度边集
每加入一条边之后,小 A 都要先判断是否存在一个边集使得所有点度数都是奇数,若存在则求出所有符合要求的边集中 最大边权 的 最小值,若不存在则输出 -1。
yzxoi
2022/09/19
2580
LuoguP2839 [国家集训队]middle
一个长度为 n 的序列 a,设其升序排序之后为 b,那么序列 a 的中位数定义为 b_{\lfloor\frac{n}{2}\rfloor},其中 a,b 从 0 开始标号,除法取下整。
yzxoi
2022/09/19
3210
SP11444 MAXOR - MAXOR & bzoj 2741 【FOTILE模拟赛】L
给定一个长度为 n 的序列 a_i,有 m 个询问,查询一段区间内的子区间的异或和最大值。
yzxoi
2022/09/19
2540
CF679E Bear and Bad Powers of 42
由于在 10^{18} 范围内,42 的幂次只有 12 个,也就是说每次操作三,最多修改 12 次,显然这个复杂度是可以接受的。
yzxoi
2022/09/19
3750
AT2172 [AGC007E] Shik and Travel
你从1号节点出发,走到一个叶子节点。然后每一天,你可以从当前点走到另一个叶子。最后回到1号节点,要求到过所有叶子并且每条边经过恰好两次。
yzxoi
2022/09/19
2780
CF1648D Serious Business
给定一个 3 行 n 列的矩阵,每个位置有权值 a_i,j,初始时除第二行任意位置均不允许通过外第一行第三行均允许通过。
yzxoi
2022/09/19
2060
CF377D Developing Game
有 n 个工人,第 i 个工人的能力是 v_i,他只与能力在 l_i ​到 r_i 之间的人在一起工作,问最多能选出多少人一起工作并输出方案。
yzxoi
2022/09/19
1710
CF377D Developing Game
CF1045G AI robots
给定 N 个点,每个点的位置为 X_i,覆盖半径为 R_i,能覆盖 [X_i-R_i,X_i+R_i],权值为 Q_i,询问能互相覆盖到并且权值之差不大于 K 的点对的数量。
yzxoi
2022/09/19
2510
YbtOJ 664「可持久化数据结构」进制路径
小 A 有一张 n 个点 m 条边的无向图。图中标号为 i 的边可以用一个三元组 (u_i,v_i,x_i) 表示,其中 u_i,v_i 为它的两个端点,长度为 2^{x_i}。
yzxoi
2022/09/19
2990
CF803G Periodic RMQ Problem
一个序列 {a_i} 由 k 个长度为 n 的序列 {b_i} 拼接而成,支持 q 个操作:
yzxoi
2022/09/19
1980
P4587 [FJOI2016]神秘数
一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数。例如S={1,1,1,4,13},
yzxoi
2022/09/16
2840
LuoguP2542 [AHOI2005] 航线规划
给定一个 n 个点 m 条边的无向图,定义 u,v 的关键边为从 u 到 v 的所有路径都必须经过的边,给定 q 个操作:
yzxoi
2022/09/19
2540
P3792 由乃与大母神原型和偶像崇拜
可以考虑记录某个点之前第一个权值相同的数的位置 p_i,然后建到线段树上,维护最大值。
yzxoi
2022/09/19
1800
CF453E Little Pony and Lord Tirek
提雷克会给出 m​ 条指令,每一条都可以被描述为 3 个整数:t_i, l_i, r_i。表示在时间为 t_i 时,提雷克会从区间 [l_i,r_i] 的小马中吸取魔力,指令保证 t 升序,计算每一条指令之后提雷克可以吸取多少点魔力。
yzxoi
2022/09/19
3000
bzoj2122 工作评估
利用空闲时间,BX希望外出工作,工作开始之前,公司就会给BX一个评估值 X_0,之后每天BX的评估值都是根据上一天的评估值和当天公司的运行状况得出,即 X_i=X_{i-1}+D_i,但是每天的评估值有一个上限,也就是说完整的评估公式应该是 X_i=\min{X_i-1+D_i,L_i}。现在BX已经知道了该公司对自己的初始评估值 X_0、公司每天的运行状况 D_i、每天的评估上限 L_i,他的空闲时间是从第 A 天到第 B 天,他希望找到一段时间 i,j (A≤i≤j≤B),使得从第i天开始工作,到第j天结束后的评估值最大。当然如果任意一段时间的工作得到评估值都<初始评估值 X_0,BX可以选择不工作,从而得到最大的评估值。
yzxoi
2022/09/19
2500
bzoj2122 工作评估
AT1984 [AGC001F] Wide Swap
给出一个元素集合为 {1,2,\dots,N}( 1\leq N\leq 500,000)的排列 P,当有 i,j (1\leq i<j\leq N)j-i\geq K (1\leq K\leq N-1) 且 P_{i}-P_{j}==1∣ 时,可以交换 P_{i} 和 P_{j}。
yzxoi
2022/09/19
7780
CF GYM102759 I. Query On A Tree 17
给定一棵以 1​ 为根节点的拥有 N​ 个节点的带点权树,初始时每个点的点权均为 0​,有 Q​ 次操作,每次操作有两种类型:
yzxoi
2022/09/19
5680
YbtOJ 971「fwt」猜拳游戏
有 n=3^m 个人(标号为 0\sim n-1)在玩猜拳。共有 t 轮游戏,每轮游戏都会进行 m 次猜拳。
yzxoi
2022/09/19
2850
P5327 [ZJOI2019]语言
在一个遥远的国度,有 n 个城市。城市之间有 n − 1 条双向道路,这些道路保证了任何两个城市之间都能直接或者间接地到达。
yzxoi
2022/09/28
3190
义乌中学暑假集训 2021.07.13 D
给定 n 个数的序列 {a_i},有 m 组询问,每次询问给定区间 [l,r],问有多少个子区间 [i,j] 满足 a_i,\dots,a_j 中不同的整数的数目是奇数。
yzxoi
2022/09/19
3680
相关推荐
YbtOJ 794「cdq 分治 整体二分」奇度边集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验