我有一个 LinkedList<具有大尺寸(3912984或更大)的整数> ,我想在字节数组中复制这些元素。整数是0或1,所以我不需要对数组进行任何大小的更改,我只想逐个复制元素,具体如何。当然,我知道最简单的方法是:
for(int i = 0; i < list.size(); i++)
array[i] = (byte)(int) list.get(i);
但是这种方法太慢了,我的程序在几小时之前就不会结束了!你能知道另一种方式(更快,像.NET的Buffer.BlockCopy())或者我必须改变数据结构吗?
答案 0 :(得分:1)
Number类中有byteValue()方法。数字由Integer,Double,Float等扩展。
List<Integer> list = getNumbers();
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext())
{
Integer i = iterator.next()
byteArray[index] = i.byteValue();
}
您还可以使用java.nio.MappedByteBuffer
类进行块复制。见http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html。
MappedByteBuffer等同于.NET中的Buffer.BlockCopy()
答案 1 :(得分:1)
使用Java 8的另一种方法:
List<Integer> enteros = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());
Byte[] bytes = enteros.stream().map(entero -> entero.byteValue()).toArray(Byte[]::new);
这是另一个测试转换时间的复杂示例:
List<Integer> enteros = new LinkedList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println("Init list: " + LocalTime.now().format(formatter));
// Fill array with 0 and 1
for(int i = 0; i < 9999999; i++) enteros.add(ThreadLocalRandom.current().nextInt(0, 2));
System.out.println("List complete: " + LocalTime.now().format(formatter));
System.out.println("Init list convert: " + LocalTime.now().format(formatter));
Byte[] bytes = enteros.stream().map(entero -> entero.byteValue()).toArray(Byte[]::new);
System.out.println("End convert! " + LocalTime.now().format(formatter));
答案 2 :(得分:0)
// example input list
List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(0);
list.add(1);
list.add(0);
list.add(1);
list.add(1);
// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (int element : list) {
out.writeUTF(Integer.toString(element));
}
byte[] bytes = baos.toByteArray();
// read from byte array
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
String element = in.readUTF();
System.out.println(element);
}