В каком-то коде я создаю список байтов и хочу вставить массив байтов в список по мере его создания. Какой самый чистый способ сделать это? См. Код ниже - спасибо.
public class ListInsert {
public static byte[] getData() {
return new byte[]{0x01, 0x02, 0x03};
}
public static void main(String[] args) {
final List<Byte> list = new ArrayList<Byte>();
list.add((byte)0xaa);
list.add(getData()); // I want to insert an array of bytes into the list here
list.add((byte)0x55);
}
}
ЕСЛИ у вас есть Byte[] arr
-- массив ссылочных типов -- вы можете использовать Arrays.asList(arr)
, чтобы получить List
.
ЕСЛИ у вас есть byte[] arr
-- массив примитивов -- вы не можете использовать Arrays.asList(arr)
для получения List
. Вместо этого вы получите одноэлементный List
.
То есть, если
байт
может быть автобоксирован вбайт
, тобайт[]
НЕ автобоксируется вбайт[]
!
(также верно для других примитивов)
Поэтому у вас есть два варианта:
байт
в байт[]
и добавить
по отдельностиbyte[]
в Byte[]
Массивы. asList
и addAll
byte[]
в List
Первый вариант выглядит так:
byte[] arr = ...;
for (byte b : arr) {
list.add(b);
}
Второй вариант с Guava выглядит так:
// requires Guava
byte[] arr = ...;
list.addAll(Bytes.asList(arr));
Здесь используется Bytes. asList
из пакета com.google.common.primitives
. В пакете есть и другие утилиты преобразования для других примитивов. Вся библиотека очень полезна.
С Apache Commons Lang вы можете использовать Byte[] toObject(byte[])
из ArrayUtils
:
// requires Apache Commons Lang
byte[] arr = ...;
list.addAll(Arrays.asList(ArrayUtils.toObject(arr)));
Есть Arrays.asList ()
метод, который именно это делает:
Arrays.asList(getData());
Итак, в вашем случае:
list.addAll(Arrays.asList(getData()));
Это может не ответить на ваш вопрос, но это должно быть хорошей практикой. Если вы сильно манипулируете массивом байтов, используйте вместо этого ByteBuffer. Этот класс имеет множество типов реализации, которые могут дать вам лучшую производительность и использование памяти. Одним из них является Direct ByteBuffer, который некоторые операции могут запускаться изначально.
Поместить байт или массив байтов так же просто, как съесть конфету:
ByteBuffer.put(byte src);
ByteBuffer.put(byte[] src);
ByteBuffer.put(byte[] src, int offset, int length);
И лучше всего, когда вы пытаетесь получить байты: напрямую, копия массива не требуется (вам нужно проверить размер хотя):)
byte[] data = ByteBuffer.array();
Надеюсь, вы передумали :)