Javaでは、コピーを作成することなく配列を切り捨てる方法はありますか?共通のイディオムはArrays.copyOf(foo, n)
です(新しい配列はn要素長です)。代替案があるとは思わないが、よりよいアプローチがあるかどうかは不思議だ。アレイをコピーせずにトランケートしますか?
24
A
答えて
19
Javaの配列の長さは、初期化後に変更することはできないため、新しいサイズで強制的にコピーを作成します。実際には、Java配列の長さパラメータはfinalと宣言されているため、一度設定すると変更することはできません。
アレイのサイズを変更する必要がある場合は、ArrayListを使用します。
0
私はそう信じません。配列は連続したメモリブロックとして割り当てられており、そのブロックの一部を解放する方法はないと想像できません。
0
簡潔に:いいえ、私の知る限りではありません。 Java配列は固定サイズのデータ構造です。 「論理的に」サイズを変更する唯一の方法は、新しい配列を作成し、それを新しい配列にコピーすることです。
代わりに、配列をコレクションにラップし、実際に値をコピーせずに論理的に配列の長さを減らすために "size"変数を使用するクラスを実装できます。これはアプローチには限界があります。実用的な場所であると想像できる唯一のケースは、メモリの制約のためにコピーできない大規模な配列を扱う場合です。
配列をコピーするのは、比較的安価です...何百万回も実行している場合を除き、おそらくこれを避けるアルゴリズムを考える必要があり、時間を無駄にしないでください。 "可変長配列"。
もちろん...代わりにArrayListを使うこともできます。はい?
5
私はそれについてもう少し考えていました...ちょうどキックのために、以下のようなものはどうですか?
注:これは単なる「できますか?」です。 Javaハッキングの知的運動。実際にこのアイデアをプロダクションコードで使用しようとする人は、間違いなく続くすべての痛みに値するでしょう。
public class Foo
{
private static byte[] array = new byte[10];
public static void main(String[] arg) throws Exception
{
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
Field arrayField = Foo.class.getDeclaredField("array");
long ptr = unsafe.staticFieldOffset(arrayField);
// doesn't work... there's gotta be a way though!
unsafe.reallocateMemory(ptr, 5);
System.out.println("New array size is: " + array.length);
}
}
関連する問題
- 1. データをコピーせずにローカルオブジェクトをポインタに変換しますか?
- 2. 2つのアレイを1つの大きなアレイにコピーしますか?
- 3. `f2py`でコピーせずにboolean配列を渡しますか?
- 4. アレイ:まず
- 5. ピボットテーブルの値をコピーせずにコピーする方法はありますか?
- 6. ラベルテキスト中間トランケート
- 7. truecrypt - マウントせずにコピー
- 8. トランザクションはトランケートでは機能しません
- 9. コピーを作成せずにstd :: stringからストリームを作成しますか?
- 10. アレイを別のアレイにコピーする条件で
- 11. Joomla JImage&SP Simple Portfolio:ファイルをコピーせずに名前を変更しますか?
- 12. MySQLのトランケートがハングする
- 13. コピー&元のファイルを削除せずに
- 14. R:コピーせずにサブセットを選択
- 15. CUDAでホストからデバイスへアレイをコピー
- 16. アレイをコピーしますがメモリを増やさない
- 17. あるアレイから別のアレイにコピーする最良の方法
- 18. ffmpegは再エンコードせずにrmvbファイルから部品をコピーできますか?
- 19. バッファ(pByte)とサイズからコピーせずにVarArray OleVariantを作成できますか?
- 20. unordered_mapの要素をコピーせずにアクセスすることはできますか?
- 21. セッションデータを参照せずにコピーする方法はありますか?
- 22. ペーストせずにメモリからコピーしたテキストを取得するには?
- 23. BCPはエラーを返さず、行もコピーしません。
- 24. Cythonを使用してコピーせずにmallocされたバッファをCからPythonに変換しますか?
- 25. Excelワークシートをコピーする方法c#winformsでExcelファイルを開かずに別のExcelブックにコピーしますか?
- 26. まずS3にファイルをzip/tarして、まずサーバーにコピーすることなくできますか?
- 27. Eclipse CDTはコピーせずに既存のソースを追加します
- 28. コピー* .inkをデスクトップにコピーしますか?
- 29. リビジョンに対処せずにマスターから孤立したブランチにファイルをコピー
- 30. ブーストグラフ:プロパティをコピーせずにグラフのノードとエッジをコピーする方法は?
+1、物事の大きさを操作したり要素を効率的に削除しようとすると、Arraylistsはとてもいいです。 – Brian