tags:

views:

100

answers:

3

Hey All,

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);
    }
}
+3  A: 

There is the Arrays.asList() method which exactly do that:

Arrays.asList(getData());

So in your case :

list.addAll(Arrays.asList(getData()));
Colin Hebert
+1 Beat me to it :p
DrDipshit
This doesn't work with `byte[]`. `Arrays.asList` doesn't "work" with array of primitives.
polygenelubricants
I thought that autoboxing would handle that, but I guess not for arrays then
DrDipshit
+7  A: 

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 a Byte, a byte[] DOES NOT get autoboxed to Byte[]!
(also true for other primitives)

So you have two choices:

  • Just iterate over each byte in byte[] and add individually
  • Use libraries
    • With Apache Commons Lang, you can convert byte[] to Byte[]
      • You can then Arrays.asList and addAll
    • With Guava can convert 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)));

Related questions

polygenelubricants
Thank you, I had not looked at the google primitives package before, will check it out now.
fred basset
+1  A: 

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 :)

instcode