Java中的直接缓冲区是否初始化为默认值,如数组?

Se *_*orm 11 java buffer initialization

当我用Java初始化数组时:

float[] array = new float[1000];
Run Code Online (Sandbox Code Playgroud)

所有元素都初始化为0.当我分配这样的直接缓冲区时也是如此:

FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer();
Run Code Online (Sandbox Code Playgroud)

?我似乎总是只得到零,但也许它依赖于实现......

jte*_*ace 5

看起来答案是可能的

查看 的实现ByteBuffer,它DirectByteBuffer在幕后使用。查看Android的实现源代码,它有这样的评论:

在新分配的 OS 内存上构造给定容量的新直接字节缓冲区。记忆将被归零。

因此,当您分配缓冲区时,所有内存内容都将被初始化为零。oracle 实现也执行此归零。

不过,这是一个实现细节。由于 javadoc 没有说明归零,因此依赖它在技术上是不正确的。正确地说,您应该自己将缓冲区归零。在实践中,如果您出于某种原因真的担心性能,您可以忽略它,但要注意 JVM 的某些实现可能不会执行此归零。

  • 我不同意:评论只是一个实现评论,而不是一个 javadoc 评论。并且它仅在Android 实现中。Oracle 实现的源代码不包含此注释,尽管它也将内存设置为 0。所以我的答案是它可能总是为零,但您不能确定。 (2认同)

Nei*_*fey 3

从父抽象类Buffer的介绍来看:

缓冲区的初始内容通常是undefined

在没有任何相反情况的情况下,我假设这适用于 ByteBuffer.allocateDirect() 分配的缓冲区。有趣的是,我认为严格来说它也适用于普通的数组支持的缓冲区,尽管在 Java 数组的分配中隐含着数组将被清零。