`new`关键字做什么

Mik*_*ike 16 java new-operator

我正在线上学习Java教程,试图学习这门语言,并且它在使用数组的两种语义之间蹦蹦跳跳.

long results[] = new long[3];
results[0] = 1;
results[1] = 2;
results[2] = 3;
Run Code Online (Sandbox Code Playgroud)

和:

long results[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

教程从未真正提到为什么它在两者之间来回切换,所以我对这个主题进行了一些搜索.我目前的理解是new操作员正在创建一个"longs数组"类型的对象.我明白的是为什么我想要那个,那有什么后果?

  • 除非它是"数组对象",否则某些"数组"特定方法不适用于数组?
  • 对于我可以用普通数组做的"数组对象",我有什么不能做的吗?
  • Java VM是否必须对通常不必执行的new操作符初始化的对象进行清理?

我来自C,所以我的Java术语在这里可能不正确,所以如果有些事情是不可理解的,请要求澄清.

Bri*_*ian 13

在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[]在方法中声明了,并且从未将其存储在方法之外的某个引用中,则会在方法调用结束时自动将其标记为垃圾回收.垃圾收集器将等待回收它的空间,直到它需要它为止,但您不必通过delete [](或delete对象的析构函数)自己进行任何回收.

编辑:承诺的一些参考:


Ste*_*n C 7

newJava中的关键字创建一个新对象.在这种情况下,它创建一个数组...这是一个对象.

这两种形式是等同的.第二个是第一个方便的简写.它是语法糖.

除非它是"数组对象",否则某些"数组"特定方法不适用于数组?

所有数组都是对象.期.

对于我可以用普通数组做的"数组对象",我有什么不能做的吗?

往上看.

Java VM是否必须清理使用new运算符初始化的对象,而这通常不需要执行?

没有.就JVM而言,以不同方式创建的对象之间没有区别.


App*_*ish 5

这两个在创建的数组的行为方面是相同的.所有数组在技术上都是java中的对象; 这些只是初始化它们的两种不同方式.也可以将两者结合起来:

long[] results = new long[]{1,2,3};
Run Code Online (Sandbox Code Playgroud)