2015-09-10 1 views
0

Кто-нибудь знает о классе Java для хранения байтов, который удовлетворяет следующим условиям?Эффективный расширяемый массив байтов Java, который позволяет получить доступ к байтам

  1. Хранит байты эффективно (т. Е. Не один объект на каждый байт).
  2. Растет автоматически, как StringBuilder.
  3. Позволяет индексный доступ ко всем его байт (без копирования все к byte[]

Я ничего не нашел до сих пор удовлетворяет этим конкретно:..

  • байт []: Не удовлетворяет 2.

  • ByteBuffer: Не удовлетворяет 2.

  • ByteArrayOutputStream: Не удовлетворяет 3.

  • ArrayList: Не удовлетворяет 1 (AFAIK, если нет какой-то особый случай-оптимизация).

Если я могу эффективно удалить байты с начала массива, это было бы хорошо. Если бы я писал это с нуля, я бы использовал его как-то вроде

{ ArrayList<byte[256]> data; int startOffset; int size; } 

а затем очевидные функции. Что-то вроде этого существует?

+0

[ByteArrayOutputStream] (http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html) –

+0

Вы можете использовать 'byte []' plus 'ArrayUtils.add()': http://commons.apache.org/proper/commons- lang/javadocs/api-3.4/org/apache/commons/lang3/ArrayUtils.html # добавить% 28byte [],% 20byte% 29 или 'ArrayByteList' http://commons.apache.org/proper/commons-primitives/ apidocs/орг/Apache// коллекции фонда/примитивы/ArrayByteList.html –

ответ

2

Самым простым было бы подкласс ByteArrayOutputStream и добавить функциональность для доступа к базовому byte[].

Удаление байтов с начала может быть реализовано по-разному в зависимости от ваших требований. Если вам нужно удалить кусок, System.arrayCopy должен работать нормально, если вам нужно удалить одиночные байты, я бы поставил headIndex, который будет отслеживать начало данных (выполнение arraycopy после удаления «данных»).

0

Вам нужно будет написать один. В верхней части моей головы я хотел бы создать ArrayList внутри и сохранить байты 4 для каждого int с соответствующими функциями для маскировки байтов. Производительность будет недостаточной для удаления и добавления отдельных байтов. Однако он сохранит объект в минимальном размере, если это реальное соображение, потратив не более 3 байтов на хранение (поверх служебных данных для ArrayList).

0

Самый ленивый метод будет ArrayList. Это не так неэффективно, как вы, кажется, верите, поскольку экземпляры Byte могут и будут разделяться, то есть во всей виртуальной машине будет всего 256 байт, если вы сами не сделаете «новый байт()».

0

Есть несколько реализаций для высокопроизводительных примитивных коллекций, таких как:

hppc или Koloboke

Смежные вопросы