在 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
(例如 List
或 Set
而不是数组,情况也是如此。
如果内容已经作为 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
(例如 List
或 Set
而不是数组,情况也是如此。