当前位置: 首页 > 面试题库 >

`new`关键字有什么作用

伯向晨
2023-03-14
问题内容

我正在网上关注Java教程,尝试学习该语言,并且它在使用数组的两种语义之间反弹。

long results[] = new long[3];
results[0] = 1;
results[1] = 2;
results[2] = 3;

和:

long results[] = {1, 2, 3};

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

  • 是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用?
  • 有什么我 不能 用普通数组做的“数组对象”吗?
  • Java VM是否必须清理用new操作符初始化的对象,而该对象通常是不需要的?

我来自C语言,因此我的Java术语在这里可能不正确,因此请澄清是否无法理解。


问题答案:

在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中工作
  • Oracle Sun垃圾回收白皮书


 类似资料:
  • 问题内容: 怎么办?例如在函数中: 问题答案: 如果使用(或-ea简称)启动程序,则此语句 相当于 如果不使用此选项启动程序,则assert语句将无效。 例如,;在你的问题中发布的,等同于 (如果你启动的是。) Java语言规范assert正式为:14.10。该声明说: 14.10。的声明 的断言是一个含有一个布尔表达式语句。断言是启用还是禁用。如果启用了断言,则断言的执行将导致对布尔表达式进行求

  • 问题内容: 在JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 它做五件事: 它创建一个新对象。这个对象的类型就是 object 。 它将这个新对象的内部不可访问的 [[prototype]] (即 proto )属性设置为构造函数的外部可访问 原型

  • 问题内容: 该SwiftUI教程使用关键字来表示可变UI状态: 它提供了以下摘要: 状态是一个值或一组值,可以随时间变化,并影响视图的行为,内容或布局。您可以将属性与@State属性一起使用,以将状态添加到视图中。 关键字的确切含义是什么? 变异变量如何导致视图重新计算? 其他变量在吸气剂中如何不变? 问题答案: 该关键字是,最近刚刚在雨燕5.1中引入的功能。如相应提案中所述,它有点像是值包装器,

  • 问题内容: 这可能是一个非常琐碎的问题,但是我既无法通过网络搜索引擎也无法在php.net上找到答案。如果您没有时间解释,请直接将我定向到可以阅读的内容。 “ var”关键字在PHP中是什么意思? PHP4和PHP5之间有什么区别吗? 问题答案: 它用于在PHP4中声明类成员变量,不再需要。它将在PHP5中工作,但是从不推荐使用的版本开始,从PHP 5.0.0版本到5.1.2版本都将发出警告。自P

  • 问题内容: python中“ yield”关键字有什么作用? 问题答案: 要了解其作用,你必须了解什么是生成器。并且,在你了解生成器之前,你必须了解。 可迭代 创建列表时,可以一一阅读它的项目。逐一读取其项称为迭代: 是一个可迭代的。当你使用列表推导时,你将创建一个列表,因此是可迭代的: 你可以使用的所有“ for… in…”都是可迭代的;lists,strings,文件… 这些可迭代的方法很方便

  • rank ▲ ✰ vote url 1 2888 2315 4033 url Python中关键字yield有什么作用? yield有什么用? 例如下面这段代码: def node._get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < s