Java中的数组与堆 在Java中,如果如下去声明一个数组:int[] a={2,3,4,5};它没有去调用new操作符,那这个数组是建立在栈中,还是堆中? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只有内置类型在栈中,byte char int float double等等 直接这么说不是很准确,先说明是局部变量还是类里定义的field比较好。 java对象都放在堆中,而Java数组也是对象 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 Java中创建对象的标识符实际上是对象的一个“引用”,如果没有用new关键字创建这个对象,这个引用是不能被操作的,而对于“引用”的存储是放在通用RAM中栈内的,但创建的对象Java将其存储到RAM中的堆内。Java数组和C/C++有一个很大的区别就在于: 当创建一个Java数组的引用时,Java会对这个引用自动初始化一个特殊值NULL, 也就是自动关联上一个对象。这正是Java追求安全性目标的一个体现,即使你写成int[] a; Java数组也是存储在RAM中的堆内的。对于这个方面的东西,建议看《Thinking in Java》第四版Page 22-24,比较详细。 这为老兄,感觉您回答得还欠妥当啊."当创建一个Java数组的引用时,Java会对这个引用自动初始化一个NULL"感觉不对,这个引用是建立在栈里的局部变量,它不会自动初始化的,如果不对它进行初始化,它会报错. 是我没有把话说清楚,可能你有一些误解了。 Java对数组引用自动初始化的是一个特殊值,这个特殊值具有关键字null。一旦编译器看到null后,就知道这个引用还没有指向任何对象,也就是说这个数组引用的自动初始化并没有关联上任何对象(即没有创建对象,此时数组引用是在栈中的)。如果在此时使用这个数组引用,就想你所说的确实会报错。但C/C++就不会报错,而是在数组初始化前访问了内存,这样对程序会造成一些无法预料的问题。这也说明了JAVA对安全性的追求。 swing 里面的 Jpanel 可以嵌入 SWT GC吗? 如何终止多个线程 本人即将毕业,面临就业压力,欲高薪请J2EE家教一名 关于这道题,assert的作用是什么? 所有基础不扎实的都来看看。 数组列表的问题!!! 困住我这个菜鸟一晚上的问题(未解决) 散分 java程序执行时,引用类何时装载? 求解 关于 初学者 出现空指针问题 在LDAP中增加记录的问题 如何禁止双击单元格更改单元格内容这种功能?
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
被操作的,而对于“引用”的存储是放在通用RAM中栈内的,但创建的对象Java将其存储到RAM中的堆内。Java数组和C/C++有一个很大的区别就在于: 当创建一个Java数组的引用时,Java会对这个引用自动初始化一个
特殊值NULL, 也就是自动关联上一个对象。这正是Java追求安全性目标的一个体现,即使你写成int[] a; Java
数组也是存储在RAM中的堆内的。对于这个方面的东西,建议看《Thinking in Java》第四版Page 22-24,比较详细。
这为老兄,感觉您回答得还欠妥当啊."当创建一个Java数组的引用时,Java会对这个引用自动初始化一个NULL"感觉不对,这个引用是建立在栈里的局部变量,它不会自动初始化的,如果不对它进行初始化,它会报错.
是我没有把话说清楚,可能你有一些误解了。
Java对数组引用自动初始化的是一个特殊值,这个特殊值具有关键字null。一旦编译器看到null后,就知道这个引用还没有指向任何对象,也就是说这个数组引用的自动初始化并没有关联上任何对象(即没有创建对象,此时数组引用是在栈中的)。如果在此时使用这个数组引用,就想你所说的确实会报错。但C/C++就不会报错,而是在数组初始化前访问了内存,这样对程序会造成一些无法预料的问题。这也说明了JAVA对安全性的追求。