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数组"类型的对象.我不明白的是为什么我想要那个,那有什么后果?
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对象的析构函数)自己进行任何回收.
编辑:承诺的一些参考:
newJava中的关键字创建一个新对象.在这种情况下,它创建一个数组...这是一个对象.
这两种形式是等同的.第二个是第一个方便的简写.它是语法糖.
除非它是"数组对象",否则某些"数组"特定方法不适用于数组?
所有数组都是对象.期.
对于我可以用普通数组做的"数组对象",我有什么不能做的吗?
往上看.
Java VM是否必须清理使用new运算符初始化的对象,而这通常不需要执行?
没有.就JVM而言,以不同方式创建的对象之间没有区别.
这两个在创建的数组的行为方面是相同的.所有数组在技术上都是java中的对象; 这些只是初始化它们的两种不同方式.也可以将两者结合起来:
long[] results = new long[]{1,2,3};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8299 次 |
| 最近记录: |