1

配列内のすべての要素をリストに追加する最も簡単な方法は何ですか?

例えば

List<Byte> l = new ArrayList<Byte>();
//Want to add each element in below array to l
byte[] b = "something".getBytes("UTF-8");

これを行うユーティリティメソッドまたは何かがありますか。addAllを使用しようとしましたが、実際の配列をコレクションに追加したいと考えています。

ありがとうございました。

編集:

明確にするために、私はこれをbyte []で実行したいと思います。これは、最終的にリストをbyte []に​​変換し直して、MessageDigest.update()にフィードするためです。それは明確にするのに役立ちますか?

編集2:

List<Byte>ですから、それは悪いようです。ひどい。基本的にバイトの配列を追加して(いくつかのSALTとユーザー情報のハッシュを作成している)、MessageDigestにフィードする場合、どのようなデータ構造が推奨されますか?

4

2 に答える 2

6

様、byte[]ご迷惑をおかけしております。ではなくArrays.asLista を持っているため、機能しません。byte[]Byte[]

これは、「プリミティブ vs クラス」の問題の 1 つです。おそらく、これをサポートするサードパーティのコレクション ライブラリ ( Apache Commons Lang プロジェクトなど) を見つけることができますが、すぐに使用できるものはないと思います。または、いつでも自分でコードを書くことができます。

List<Byte> l = new ArrayList<Byte>();
for (byte b : "something".getBytes("UTF-8"))
{
    l.add(b);
}

これは、一連のバイトに対して非常に非効率的なストレージ形式であることに注意してください。オートボクシングにより、余分なオブジェクトを作成しないことが保証Byteされますが、参照になるため、要素ごとに 4 または 8 バイトが残ります。List<Byte>aが適切であることはめったにありません - 本当にここで必要です?

実際にクラスを扱っている場合、たとえば、 がString[]あり、 が必要なList<String>場合は、次を使用できますArrays.asList()

String[] array = ...;
List<String> list = Arrays.asList(array);

ただし、配列をラップする読み取り専用リストが返されます。変更可能なリストが必要な場合はそのラッパーをArrayListコンストラクターに渡すだけです。

String[] array = ...;
List<String> list = new ArrayList<String>(Arrays.asList(array));
于 2012-08-15T18:23:18.210 に答える
3

ループ内ですべての要素を一度に 1 つずつ追加する場合を除き、Apache commons のArrayUtilsを使用してプリミティブ配列をオブジェクト配列に変換してから、次を使用できますaddAll()

byte[] b = "something".getBytes("UTF-8");
Byte[] bArray = ArrayUtils.toObject(b);

List<Byte> l = new ArrayList<Byte>();
l.addAll(bArray);
于 2012-08-15T18:25:41.897 に答える