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()代码>。那么,它与使用coreByteArrayOutputStream
类(这将避免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();