在Java中,所有数组和对象都是在堆上分配的,因此从某种意义上讲,所有数组都是“数组对象”。在Java中,分配给堆栈的唯一内容是对象引用和原语。其他所有内容都是在堆中定义和分配的对象,包括数组,无论您使用哪种语法对其进行声明。(您的两个示例在最终结果中是等效的,有关如何实际分配和分配每个示例的更多信息,请参见JLS§10.3及其链接的部分。)
这与C / C 相反,在C / C 中,您可以显式控制堆栈和堆的分配。
请注意,关于短期对象分配/重新分配,Java的速度非常快。它具有基于世代的垃圾收集器,因此非常高效。因此,回答您的问题:
是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用?有什么我不能用普通数组做的“数组对象”吗?
没有像数组这样的东西不是对象,所以没有。这里 是 但是,这不会对原始阵列工作方式。采取的方法必须先将转换为才能
Object[]接受。这是由于Java
5及更高版本中自动装箱的一些实现细节。
long[]``Long[]
Java VM是否必须清理用
new操作符初始化的对象,而该对象通常是不需要的?
分配给它的任何东西
new最终都必须被垃圾回收,那么就做任何 通常 不会做的事情而言?否。但是,请注意,在C / C
++,使用分配的数组
malloc/
new手段你也有
free/
delete []它,这是你 不
必须用Java做的,因为它会收回该阵列为您服务。
请注意,如果
long[]在方法中声明了your
,并且从未将其存储在方法之外的引用中,则在方法调用结束时,系统将自动将其标记为垃圾回收。垃圾收集器将等待回收其空间,直到需要它为止,但您不必自己通过
delete[](或
delete对象的析构函数)进行任何回收。
编辑: 承诺的一些参考:
- 垃圾回收如何在Java中工作
OracleSun垃圾回收白皮书



