在 Java 中创建一个新数组有多昂贵?

How expensive is it to create a new array in Java?

如果内容已经作为 ByteBuffer 可用,从它们创建数组的成本是多少?

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中的一个对象数组实际上是一个引用数组(指针)。从概念上讲,我们认为数组包含三个 ByteBuffer 对象。但实际上该数组仅包含内存中的一个地址,其中每个 ByteBuffer 对象都可以找到。

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

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

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