2009-10-14 3 views
5

Каков наиболее эффективный способ сделать это?Создание байта [] из списка <Byte>

+1

-1 Потому что вы просите наиболее эффективнее вместо простейшего, самого чистого, простого для понимания путь. Почему так много людей тратит столько времени на микрооптимизацию? – starblue

+3

starblue «самый эффективный» может означать «проще всего писать и поддерживать», что, вероятно, подразумевает простейший и чистый. Эффективное слово не должно ссылаться на производительность. –

+1

+1 Потому что иногда вы делали домашнее задание (профилирование) и действительно нуждались в этой оптимизации. Вопрос, как правило, имеет значение, даже не обязательно в случае с ОП. –

ответ

12
byte[] byteArray = new byte[byteList.size()]; 
for (int index = 0; index < byteList.size(); index++) { 
    byteArray[index] = byteList.get(index); 
} 

Вы не можете, как это, но это почти единственный способ создания Genuine ™ Array® из byte.

Как указано в комментариях, существуют и другие способы. Однако ни один из этих способов не обходится: a) создание массива и b) назначение каждого элемента. Этот использует iterator.

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

Да, вот что я подумал ... Вы правы, я не связываю это. – mysomic

+0

нет ТОЛЬКО один способ программирования чего-то! как насчет использования Iteraotr или ListIterator? –

+0

Ты абсолютно прав. Добавлен пример на основе «Итератор». :) – Bombe

4

Метод toArray() звучит как хороший выбор.

Обновление: Хотя, как любезно отметили люди, это работает со значениями «в штучной упаковке». Таким образом, простой for -loop также выглядит очень хорошим выбором.

+0

хорошо его в одну сторону, но создаст байт [], который требует отдельного распаковки элементов. – mysomic

+1

Все значения байтов хранятся как неизменяемый объект (см. Http://today.java.net/pub/a/today/2005/03/24/autoboxing.html). Таким образом, распаковка (возможно) незначительна с точки зрения производительности. Было бы интересно измерить. Ну, не * интересно *. –

+0

, и вам понадобится unboxing в любом случае, если вы хотите (примитивные) байты –

2

Использование Bytes . toArray (Collection<Byte>) (из Guava библиотеки Google.)

Пример:

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(); 
Смежные вопросы