【问题标题】:Creating a byte[] from a List<Byte>从 List<Byte> 创建一个 byte[]
【发布时间】:2010-12-06 15:12:51
【问题描述】:

最有效的方法是什么?

【问题讨论】:

  • -1 因为您要求的是最有效的方法,而不是最简单、最干净、最容易理解的方法。为什么这么多人在微优化上浪费了这么多时间?
  • starblue,“最高效”可能意味着“最容易编写和维护”,这可能意味着最简单和最干净。高效这个词不一定指性能。
  • +1 因为有时您已经完成了作业(分析)并且确实需要进行此优化。问题通常是相关的,即使在 OP 的情况下也不一定。

标签: java arrays list byte


【解决方案1】:
byte[] byteArray = new byte[byteList.size()];
for (int index = 0; index < byteList.size(); index++) {
    byteArray[index] = byteList.get(index);
}

您可能不喜欢它,但这是创建 byte 的 Genuine™ Array® 的唯一方法。

正如 cmets 中所指出的,还有其他方法。但是,这些方法都没有绕过 a) 创建数组和 b) 分配每个元素。这个使用iterator

byte[] byteArray = new byte[byteList.size()];
int index = 0;
for (byte b : byteList) {
    byteArray[index++] = b;
}

【讨论】:

  • 编程的方法不止一种!使用 Iteraotr 或 ListIterator 怎么样?
  • 你说得对。添加了一个基于Iterator 的示例。 :)
【解决方案2】:

使用 @987654321@.@987654322@(Collection&lt;Byte&gt;)(来自 Google 的 Guava 库。)

例子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.primitives.Bytes;

class Test {
    public static void main(String[] args) {
        List<Byte> byteList = new ArrayList<Byte>();
        byteList.add((byte) 1);
        byteList.add((byte) 2);
        byteList.add((byte) 3);
        byte[] byteArray = Bytes.toArray(byteList);
        System.out.println(Arrays.toString(byteArray));
    }
}

或者类似地,使用PCJ:

import bak.pcj.Adapter;

// ...

byte[] byteArray = Adapter.asBytes(byteList).toArray();

【讨论】:

    【解决方案3】:

    @987654321@ 方法听起来是个不错的选择。

    更新:尽管正如人们善意地指出的那样,这适用于“盒装”值。所以一个普通的for-loop 看起来也是一个很好的选择。

    【讨论】:

    • 这是一种方式,但会产生一个 Byte[] ,这需要对单个元素进行拆箱。
    • 所有字节值都存储为不可变对象(请参阅today.java.net/pub/a/today/2005/03/24/autoboxing.html)。所以拆箱在性能方面(可能)可以忽略不计。不过,测量起来会很有趣。嗯,不有趣
    • 如果你想要(原始)字节,无论如何你都需要拆箱
    • @Brian:您还需要考虑空间开销。对于相同的信息内容,一个大的 Byte[] 将占用至少 4 倍于一个 byte[] 的空间。可能更多,取决于原始 Byte 值的创建方式。
    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多