当前位置: 首页 > 知识库问答 >
问题:

Java中的数组是否存储数据或指针

轩辕鸿祯
2023-03-14

我正在阅读有关数据位置的内容,并想用它来改进我正在编写的游戏引擎。

假设我在不同时间创建了五个对象,它们现在都在内存中的不同位置,而不是彼此相邻。如果我将它们全部添加到一个数组中,该数组是否只保存指向这些对象的指针,并且它们将留在内存中的相同位置,或者将它们全部添加到数组中重新排列并使它们连续。

我问这个问题是因为我认为使用数组是使它们连续的好方法,但我不知道数组是否会解决我的问题!

共有3个答案

苏硕
2023-03-14

Java只处理对对象的引用。因此,不能保证数组的元素在内存中是连续的。

编辑:我猜这个答案不太清楚。我的错。我的意思是,由于一维数组是连续存储的,所以尽管引用是连续的,但不能保证对象本身是连续的。尽管如此,巴兹尔·伯克的回答完美地解释了这一过程的原理。

贺海
2023-03-14

数据或值存储在对象中,并且使用对象的引用来检索值。让我再明确一点,Java中的数组是以对象的形式存储的。所以毫无疑问,对象存储值并使用该特定对象的引用变量进行访问。希望你明白了。

赫连智
2023-03-14

操纵对对象的引用数组对对象没有影响,对对象在内存中的位置也没有影响。

对象数组实际上是指向对象的引用(指针)数组。指针是指向内存中另一个位置的地址。

我们将阵列称为容纳对象,但这在技术上并不准确。因为Java不会向程序员公开指针本身,所以我们通常不知道它们的存在。当我们访问数组中的元素时,实际上是在检索指针,但Java会立即跟随该指针在内存中的其他位置定位对象。

这种自动查找,跟随指向对象的指针,使指针数组感觉像一个对象数组。Java程序员认为她的数组保存着她的对象,而实际上对象是一跳一跳的。

Java中的数组被实现为连续的内存块。对于对象数组,指向这些对象的指针存储在连续的内存中。但是当我们访问元素时,我们会跳转到内存中的另一个位置来访问我们想要的实际对象。

添加元素可能“便宜”,因为如果内存中的相邻内存恰好可用,可以将其分配给阵列,以便为更多元素腾出空间。实际上,这不太可能。很可能必须在内存中的其他位置构建新数组,将所有指针复制到新数组,然后丢弃原始数组。

这样一种新的阵列和复制“昂贵”。如果可行,我们希望避免这种操作。如果知道数组的可能最大大小,请在声明数组时指定该大小。将立即声明整个连续内存块,数组中的内容为空,直到稍后为元素分配指针。

插入阵列的中间也很昂贵。要么构建新阵列并复制元素,要么将插入点之后的所有元素向下移动到相邻位置。

这些对阵列的操作都不会影响对象。这些物体漂浮在记忆的乙醚中。对象对数组一无所知。阵列上的操作不会影响对象及其在内存中的位置。唯一的关系是,如果数组中保存的引用是最后一个仍然指向该对象的引用,那么当清除或删除该数组元素时,该对象将成为垃圾收集的候选对象。

在Java中,八种原始类型(byteintlong浮动booleanchar)不是对象/类,也不是面向对象编程。与对象相比,它们的一个优点是速度快且占用内存少。

基元数组保存数组本身中的值。因此,这些值彼此相邻地存储在内存中。无引用/指针。不要在记忆中跳跃。

对于添加或插入,上面讨论的相同行为也适用。除了指针被洗牌,实际的原语值被洗牌。

在商业应用程序中,通常最好使用对象。

这意味着使用包装类而不是原语。例如,Intger而不是int。Java中的自动装箱工具通过在原语值和它们的对象包装器之间自动转换来简化这一点。

首选对象意味着使用Collection而不是数组,通常是List,特别是ArrayList。或者为了不可变的使用,从新的List.of方法返回的List实现。

与商业应用程序相比,在速度和内存使用至关重要的极端情况下,例如您的游戏引擎,然后充分利用数组和原语。

将来,如果在Project Valhala中完成的工作取得成果,对象和原语之间的区别可能会模糊。

 类似资料:
  • 当页面第一次加载时,我需要检查中是否有图像,并加载最后一个图像。 否则,我禁用预览按钮,提醒用户按下新图像按钮,并创建一个空数组来放置图像; 问题是中的

  • Kafka broker是否存储producer API使用的元数据(例如,哪个分区是主题的领导者等。)?根据我的理解,这些元数据存储在Zookeeper中,对吗?如果这是真的,那么动物园管理员如何更新经纪人的最新信息?

  • 我上传图像使用平均堆栈和Multer模块 我可以从angular中检索图像,甚至可以将图像路径发布到Mongoose集合 问题是,我希望有一个图像数组,但在发布到mongoose时,它会将每个图像存储为一个新记录 图像模式 POST API 收藏已保存 如果我发布两张图像,它将按如下所示进行存储,但我希望两张图像都保存在同一记录中,即在内 ** ** 请帮忙。

  • 问题内容: 我正在尝试将sql数据库中的数据存储到数组中。目前我有这个: 问题是我有8行数据。我需要将数据库中的每个8个名称存储到一个数组中。当我尝试这个: 它不起作用。 问题答案: 您想要的是: 这会将所有8个名称存储在类似于以下内容的数组中:

  • 在具有管道和转发功能的MIPS体系结构上: add指令将在步骤3(执行操作)准备好结果,但我假设sw指令希望在步骤2(指令解码)得到结果 David A. Patterson的《计算机组织与设计》一书中有一个已解决的练习:在以下代码段中找到危险并重新排序指令以避免任何管道停滞: 解决方案: 在解决方案中,它正确识别加载使用危险并相应地重新排列代码,但是否也存在执行存储危险?

  • 我正在为一个Delphi可执行文件开发一个C++的DLL项目。此可执行文件具有如下结构: 例如: 我试着做了这样的课程: 它给了我这个: 那不是我想要的。 我可以通过使用一个数组来实现我的目标: 但是,我被迫有一个固定的长度,这仍然不是我想要的。 我想了一个肮脏的解决办法: 但要解析、读取和写入它真的很难。 这样的问题有没有干净的解决方案? 顺便说一下,这不是一个XY问题