In some code I'm creating a List of Bytes, and want to insert an array of bytes into the list as I am building it. What is the cleanest way of doing this? See code below - thanks.
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);
}
}
IF you have a Byte[] arr
-- an array of reference types -- you can use Arrays.asList(arr)
to get a List<Byte>
.
IF you have a byte[] arr
-- an array of primitives -- you can't use Arrays.asList(arr)
to get a List<Byte>
. Instead you'll get a one-element List<byte[]>
.
That is, while a
byte
can be boxed to aByte
, abyte[]
DOES NOT get autoboxed toByte[]
!
(also true for other primitives)
So you have two choices:
byte
in byte[]
and add
individuallybyte[]
to Byte[]
Arrays.asList
and addAll
byte[]
immediatelly to List<Byte>
The first option looks like this:
byte[] arr = ...;
for (byte b : arr) {
list.add(b);
}
The second option with Guava looks like this:
// requires Guava
byte[] arr = ...;
list.addAll(Bytes.asList(arr));
This uses Bytes.asList
from package com.google.common.primitives
. The package has other conversion utilities for other primitives too. The entire library is highly useful.
With Apache Commons Lang, you can use Byte[] toObject(byte[])
from ArrayUtils
:
// requires Apache Commons Lang
byte[] arr = ...;
list.addAll(Arrays.asList(ArrayUtils.toObject(arr)));
int[]
into List<Integer>
in Java?Arrays.asList()
not working as it should?This might not answer your question but it should be a good practice. If you are heavily manipulating an array of bytes, use the ByteBuffer instead. This class have many types of implementation which can give you the best performance & memory usage. One of them is the Direct ByteBuffer which some operations can run natively.
To put a byte or an array of bytes is as simple as eating a candy:
ByteBuffer.put(byte src);
ByteBuffer.put(byte[] src);
ByteBuffer.put(byte[] src, int offset, int length);
And the best thing is when you trying to get the bytes out: directly, no array copy's needed (you need to check the size though) :)
byte[] data = ByteBuffer.array();
Hope you change your mind :)
There is the Arrays.asList()
method which exactly do that:
Arrays.asList(getData());
So in your case :
list.addAll(Arrays.asList(getData()));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With