当我在Java中初始化一个数组,比如:
float[] array = new float[1000];
所有元素是否都初始化为0。如果我像这样分配直接缓冲区,情况是否也是这样:
FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer();
?我似乎总是只得到零,但也许这取决于实现方式...
当我在Java中初始化一个数组,比如:
float[] array = new float[1000];
所有元素是否都初始化为0。如果我像这样分配直接缓冲区,情况是否也是这样:
FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer();
?我似乎总是只得到零,但也许这取决于实现方式...
ByteBuffer
的实现,它在底层使用DirectByteBuffer
。查看Android的源代码,可以得知以下注释:
因此,当您分配一个缓冲区时,所有的内存内容都将被初始化为零。Oracle的实现也会进行这种清零操作。在新分配的操作系统内存上构造给定容量的新直接字节缓冲区。内存将被清零。
从父抽象类Buffer的文档中可以得知:
缓冲区的初始内容通常是未定义的。
在没有其他说明的情况下,我认为这也适用于通过ByteBuffer.allocateDirect()分配的缓冲区。有趣的是,我认为严格来说这也适用于普通的基于数组的缓冲区,尽管在分配Java数组时隐含着数组将被清零。
无法确定,因此问题是徒劳的。初始位置为零,因此您无法执行任何API以返回尚未“放置”的缓冲区部分。
0.0f
,而在后一种情况下,每个读取到的浮点数都是0.0f
,只是因为 IEEE-754 位模式 为“全零”。 - user166390