- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列のサイズをrealloc的に変更するには?)
配列のサイズを動的に変更する方法はあるのか?
このQ&Aのポイント
- 配列のサイズを動的に変更する方法を探しています。
- 現在はrealloc関数を使用してメモリ領域を拡張していますが、他にオーバーヘッドが少ない方法はあるのでしょうか?
- 保持するデータはfloat型で、計算が激しいためArrayList<Double>は適していません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
realloc も確保できない場合は、新たに確保してデータコピーを行うということを考えると、大して変わらないような気がしますが、 Vector は、どうですかね。 ensureCapacity で必要なサイズが足りている(Vector は、あらかじめ余分に領域を持っています)ならそのまま、足りないなら前のサイズの倍で拡張していきます。 >Javaでオーバーヘッドが少ない配列の拡張方法ってあるのでしょうか? 配列の拡張が見込まれる場合は、最初から大きめに確保するのが拡張によるオーバーヘッドを少なくすることになります。
お礼
ご回答ありがとうございます。 Vectorもプリミティブ型を保持する場合、ラッパークラスを利用しますが、演算性能が著しく低下するようなのでなるべく使いたくありません。 例えば、 // 変数、可変長配列初期化 float[] a = new float[1000000]; Vector<Float> v = new Vector<Float>(); for (int i=0; i<1000000; i++) v.add(a[i] = i); // float[]による演算 long time0 =System.currentTimeMillis(); for (int cnt=0; cnt++<100) for (int i=0; i<999998; i++) a[i] = (a[i]+a[i+1])/a[i+2]; // Vector<Float> による演算 long time1 = System.currentTimeMillis(); for (int cnt=0; cnt++<100) for (int i=0; i<999998; i++) v.set(i, (v.get(i)+v.get(i+1))/v.get(i+2)); long time2 = System.currentTimeMillis(); System.out.println(time1-time0); System.out.println(time2-time1); # 結果 1985 56687 やはり最初に多めに確保して、必要があれば拡張するしかなさそうですね。 ただ、現在保有しているデータ数を正確に保持する必要があるので、仮想的なサイズ変数を持たせたりする必要があるのですが、配列を他のメソッドに渡すときにちょっと面倒です…