【问题标题】:How expensive is it to create a new array in Java?在 Java 中创建一个新数组的成本是多少?
【发布时间】:2021-08-08 09:03:22
【问题描述】:

内容是否应该已经以ByteBuffers 的形式提供,从它们创建数组的费用是多少?

import java.nio.ByteBuffer;

public class Main
{
    public static void main(String[] args) {
        ByteBuffer buf1 = ByteBuffer.allocate(666); /*(0)*/
        ByteBuffer buf2 = ByteBuffer.allocate(666); /*(0)*/
        ByteBuffer buf3 = ByteBuffer.allocate(666); /*(0)*/
        
        ByteBuffer arr[] = new ByteBuffer[]{buf1,buf2,buf3}; /* (1) */
    }
}

数组创建不应该取决于缓冲区的大小,对吧?

【问题讨论】:

  • 您在寻找什么类型的答案?
  • 我认为这仅取决于缓冲区的数量
  • Java 索引 references 中的对象数组。所以如果你问内存中数组的大小是否取决于缓冲区的大小,那么答案是否定的。

标签: java arrays buffer


【解决方案1】:

Java 中的对象数组实际上是引用(指针)数组。从概念上讲,我们将数组视为保存您的三个 ByteBuffer 对象。但实际上,该数组仅保存相当于内存中每个 ByteBuffer 对象的地址。

访问数组是一个两步过程。当您访问数组中的元素时,例如arr[ 2],首先引用位于数组的那个位置/槽中。其次,使用该引用,JVM 会跳转到特定对象所在的引用所指向的内存位置。

所以您的数组使用的内存非常少。该数组不会复制您的ByteBuffer 对象。在创建数组的代码行之前,您有三个 ByteBuffer 对象在内存中的某个地方浮动。在创建数组之后,您仍然只有相同的三个 ByteBuffer 对象在内存中浮动。

顺便说一句,如果您使用 Collection(例如 ListSet 而不是数组),情况也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2012-11-28
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多