Являются ли прямые буферы в Java инициализированными значением по умолчанию, как массивы?

когда я инициализирую массив в Java, как:

float[] array = new float[1000];

все элементы равны 0. Это также случай, когда я выделяю прямой буфер следующим образом:

FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer();

? Я всегда получаю только нули, но, возможно, это зависит от реализации...

4 ответов


от дукментации к родительскому буферу абстрактного класса:

начальное содержимое буфера, в общем,неопределено.

при отсутствии чего-либо противоположного я бы предположил, что это относится к буферам, выделенным ByteBuffer.allocateDirect(). Интересно, что я полагаю, что строго это относится и к обычным буферам с поддержкой массива, хотя это неявно в распределении массива Java, что массив будет обнуленный.


похоже, что ответ наверное.

глядя на реализацию ByteBuffer, Он использует DirectByteBuffer под капотом. Взглянув на реализацию исходный код Android, он имеет этот комментарий:

создает новый буфер прямого байта данные мощности по вновь выделенным Память ОС. Воспоминание будет обнуленный.

Итак, когда вы выделяете буфер, все содержимое памяти будет инициализирован до нуля. Реализация oracle также выполняет это обнуление.

но это деталь реализации. Поскольку javadoc ничего не говорит об обнулении, технически неправильно полагаться на него. Чтобы быть правильным, вы действительно должны обнулить буфер самостоятельно. На практике, если вы действительно беспокоитесь о производительности, вы можете оставить его, но предупредил, что некоторые реализации JVM не может сделать это пристрелка.


глядя на Javadoc для Java 7 и Java 8

теперь он говорит

позиция нового буфера будет равна нулю, его предел будет равен емкость, ее метка будет неопределенной, и каждый из ее элементов будет инициализировано до нуля. Имеет ли он резервный массив или нет энное

таким образом, вам больше не нужно обнулять их самостоятельно.


нет способа сказать, поэтому вопрос бесполезен. Начальная позиция равна нулю, поэтому нет API, который вы можете выполнить, который вернет часть буфера at еще не был "помещен".