Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most concise way to insert array of bytes into List<Byte>?

Tags:

java

list

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);
    }
}
like image 257
fred basset Avatar asked Aug 20 '10 16:08

fred basset


3 Answers

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

  • How to convert int[] into List<Integer> in Java?
  • Arrays.asList() not working as it should?
  • Performance impact of autoboxing
  • Most useful free third party Java libraries?
like image 134
polygenelubricants Avatar answered Nov 04 '22 11:11

polygenelubricants


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

like image 42
instcode Avatar answered Nov 04 '22 12:11

instcode


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

Arrays.asList(getData());

So in your case :

list.addAll(Arrays.asList(getData()));
like image 31
Colin Hebert Avatar answered Nov 04 '22 12:11

Colin Hebert