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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于海生 黑马帝   /  2011-12-22 22:39  /  2958 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于海生 于 2011-12-23 11:43 编辑

int [] arr = new int [] {3,5,1,7};
   这种形式在堆内存中开辟了一个数组空间。
int [] arr = {3,5,1,7};
  这种形式没有new关键字,是在堆内存中开辟空间,还是在栈内存中开辟空间呢?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

5 个回复

正序浏览
java的堆是一个运行时的数据区,用来存储数据的单元,存放通过new关键字新建的对象和数组,对象从中分配内存。
在堆中声明的对象,是不能直接访问的,必须通过在栈中声明的指向该引用的变量来调用。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
两种都是在堆里面存,栈里面有引用指向堆里面对应的对象
回复 使用道具 举报
int [] arr = new int [] {3,5,1,7};与int [] arr = {3,5,1,7};其实只是写法不同而已。第二中是属于静态初始化方式。只要是引用数据类型,“=”后的语句都是在堆内存中开辟空间。
回复 使用道具 举报
两种形式等价,堆存数据,栈存指针
回复 使用道具 举报
数组和对象,通过new建立的实例都存放在堆内存中;每一个实体都有内存地址值;
所以应该也是在堆内存中开辟空间。

详细内容如下:

格式: 元素类型[] 数组名=new 元素类型[]{元素,元素……};
示例: Int[] arr=new int []{3,5,1,7};
          Int[] arr={3,5,1,7};

数组属于引用数据类型

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

除了栈内存和堆内存,内存区还有方法区、本地方法区、寄存器

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
也是在堆内存中,两种形式是等价的,栈内存中存的是地址值。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

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