A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 古银平 中级黑马   /  2012-5-14 19:52  /  2489 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int[] a={2,5,6,8};  int[] b={5,6,7};
执行 a=b;后内存中数组的原理,不太理解栈内存和堆内存?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

正序浏览
数组赋值的内部原理:
int[] a={2,5,6,8};  int[] b={5,6,7};由另外一种表达式
int[] a=new int[]{2,5,6,8}  int[] b=new int[]{5,6,7};
在创建数组a和数组b时,虚拟机都会在内存中分配一些空间
局部变量a,b 我们在栈内存中开辟一些空间给它,建立起的实体
(也就是new出来的对象)会在堆内存
每个创建的对象都有一个地址值,a,b都是通过地址值调用对象
当你把a=b是就像相当于把b的地址值赋给了a,a就可以对b对象进行操作。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据的方式和内存管理方式。
>栈内存   用于存储局部变量,当数据使用完,所占空间会自动释放。
>堆内存   数组和对象,通过new建立的实例都存放在堆内存中。
  每一个实体都有内存地址值。   实体中的变量都有默认初始值   实体不再被使用,会在不确定的时间内被垃圾回收器回收。

可以简单的理解为,局部变量,都在栈内存中 。new出来的东西都在堆内存中。

你上面的例子 a=b 其实是把b对应的那个数组的引用给了a。其实这时候a原先对应的那个还在内存里呆着了,只不过成了没人要的孩儿了。
最后结果是在不知道什么时候被jvm的垃圾回收器当垃圾给处理掉

评分

参与人数 2技术分 +1 黑马币 +8 收起 理由
贠(yun)靖 + 1
古银平 + 8 很给力!解决了

查看全部评分

回复 使用道具 举报
首先 你需要明白,数组实际上是在内存中的连续空间,而栈内存中的数组名(就是你的a,b)是指向这串空间的首地址,也就是a[0],b[0].
当你执行a=b的时候   就是把a的指针指向了b的首地址

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马