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

时间:2021-05-19 06:12:05

标签: java arrays buffer

内容是否应该已经作为 ByteBuffer 可用,expensize 如何从它们创建数组?

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) */
    }
}

数组创建不应该依赖于缓冲区的大小,对吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

相关问题