4

Long[](un)box&copyを使用した明らかなforループの外で、Javaで変換しlong[]たり、その逆を行ったりするための効率的で迅速かつクリーンな方法を知っている人はいますか?

注:これは、開封またはボクシングに関するものではありません。私は明示的に配列について話しているのです!Longlong

「ループしてコピーするより良い方法はありません」も答えになります;)

編集: 私は上記を行うことの意味を認識しており、それを避ける方が良いことを知っています。ただ、私はそれを避けることはできず、サードパーティのものを使用せずに可能な限り賢くやりたいと思っています。

4

7 に答える 7

9

Apache Commons langを使用する場合は、次のことができます。

long[] primitive = ArrayUtils.toPrimitive(new Long[]{1L, 2L, 3L, 4L});
于 2012-12-13T12:33:36.093 に答える
8

ループしてコピーするよりも良い方法はありません

最善の解決策は、最初から変換を避けることです。Long[]コレクションを使用する必要がlong[]ある場合は、long[] をラップする TLongArrayList を試すことができます。

于 2012-12-13T12:33:57.907 に答える
4

Java がボックス化/ボックス化解除すると、ユーザーに表示されなくても、実際には何かを実行します。

Long[]long[]は非常に異なるオブジェクトです。答えは、いいえ、ループしてコピーする必要があるということです。しかし、より良い質問は、なぜこれが必要なのですか? ほとんどすべての状況でそれらを交換可能に使用できます...実装時に、オブジェクトの作成とメモリの使用のどちらがより重要かを決定する必要があります。うまくいけば、Java の値のキャッシングを使用するために s (またはオートボクシング) をLong.valueOf作成するために使用します。LongLong

これはapache common langのソースですArrayUtils.toPrimitive。ループを使用しています。

public static long[] toPrimitive(Long[] array) {
  if (array == null) {
    return null;
  } else if (array.length == 0) {
    return EMPTY_LONG_ARRAY;
  }
  final long[] result = new long[array.length];
  for (int i = 0; i < array.length; i++) {
    result[i] = array[i].longValue();
  }
  return result;
}
于 2012-12-13T12:33:03.940 に答える
1

Java 自体は、オブジェクトの配列をプリミティブの配列に変換する方法を提供しません。

于 2012-12-13T12:33:19.307 に答える
1

ArrayUtil リファレンスこれが役立つことを願っています。

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
于 2012-12-13T12:33:27.530 に答える
1

繰り返し使用できるヘルパー関数でラップされたループとコピーよりも優れた方法はありません。

于 2012-12-13T12:33:31.650 に答える
0

ここで詳しく説明されているように、Apache の ArrayUtils を使用して実行できます。

プリミティブ long の配列を long のリストに変換します

于 2012-12-13T12:33:48.153 に答える