Java:转换ArrayList的最佳方法是什么<;字节>;到字节[]?

Java:转换ArrayList的最佳方法是什么<;字节>;到字节[]?,java,Java,没有。更容易: byte[] byteArray = new byte[bytes.size()]; for (int i = 0; i < bytes.size(); i++) { byteArray[i] = bytes.get(i); } 如果你真的想要原语: Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]); byte[]原语=新字节[byteArray.length] for(int i=0;i

没有。更容易:

byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
   byteArray[i] = bytes.get(i);
}
如果你真的想要原语:

Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]);
byte[]原语=新字节[byteArray.length]
for(int i=0;i
这保证了链表和调整数组大小实现的线性时间复杂性

从5.0开始支持它:

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray(T[]


您可以始终使用类似于from的内容,而不是
数组列表。然后,您的算法将变成:

byte[] primitives = new byte[byteArray.length]
for (int i = 0; i < byteArray.length; i++) {
  primitives [i] = (byte)byteArray[i];
}
使用另一个答案中建议的
toArray()
不起作用,因为该方法无法自动将包装类型
Byte
转换为原语
Byte

,在Apache Commons中使用:

byte[] byteArray = bytes.toArray(new byte[bytes.size()]);

我建议使用
ByteArrayOutputStream
而不是
ArrayList
来收集您的输入:

byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));

这避免了装箱和取消装箱每个字节的可怕开销。(我还修复了原始代码中的一个小错误,如果
putObjectRequest
为空,您将编写
-1

是的,这甚至不编译OP想要的是
字节[]
,而不是
字节[]
。。。我想?是的,我想要的是
byte[]
而不是OPit中提到的
byte[]
,不需要将数组大小作为参数传递。因此,与OP那样简单地迭代原始
ArrayList
不同,您建议将
ArrayList
转换为
byte[]
然后迭代。这是怎样的进步?(OP使用的是
ArrayList
,而不是一些随机链表实现。)对于ArrayList实现,这很好,但它将在任何链表实现上以多项式时间运行。写入对象数组,然后使用静态强制转换进行迭代更安全,因为可以保证线性时间。@SamGrondahl-OP使用的是
ArrayList
,它不是链表实现。我敢打赌,它使用的是main--answer中的代码。您必须决定是喜欢三行代码还是一行代码和一个JAR依赖项。这不太管用,因为
TByteList
是一个接口。它需要是
TByteList bytes=new TByteArrayList()。那么,它与使用core
ByteArrayOutputStream
类(这将避免jar依赖)没有多大区别。@TedHopp:Whoops感谢接口提示。没错,在这种情况下,使用
BAOS
可能是最佳选择。我把它作为OP的问题“这是唯一的方法吗?”
byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
   byteArray[i] = bytes.get(i);
}
byte[] byteArray = bytes.toArray(new byte[bytes.size()]);
byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
    int data = putObjectRequest.getInputStream().read();
    while (data != -1) {
        bos.write(data);
        data = putObjectRequest.getInputStream().read();
    }
} catch (IOException e) {
    e.printStackTrace();
}
byte[] byteArray = bos.toByteArray();