Javaの可変長(動的)配列


回答:


121

はい:ArrayListを使用します。

Javaでは、「通常の」配列は固定サイズです。あなたはそれらにサイズを与える必要があり、それらを拡大したり縮小したりすることはできません。サイズを変更するには、新しい配列を作成し、必要なデータをコピーする必要があります。これは非効率であり、面倒です。

幸い、一般的なデータ構造を実装するあらゆる種類の組み込みクラスと、その他の便利なツールもあります。それらの完全なリストについては、Java 6 APIを確認てください。

1つの注意点:ArrayListはオブジェクト(例:整数)のみを保持でき、プリミティブ(例:int)は保持できません。ほとんどの場合、自動ボクシング/自動アンボクシングがこれをサイレントに処理しますが、実行している内容によっては奇妙な動作が発生する可能性があります。


2
次のコードがJavaで正しいのはなぜですか?int[] array = new int[size]; sizeは変数ですが、配列の長さは固定されている必要がありますね。@ Lord Torgamus
jerry_sjtu

12
@jerry_sjtuええ、sizeプログラムが進行しても配列のサイズは変更されません。sizeその行が実行されたときに発生するサイズを取得します。
ポップス

ArrayListから項目を削除するたびにnull、最後にaが付きます。何かアイデアはありますか?
アーロンフランケ2018

37

Javaの配列は固定サイズです。必要なのは、Javaで利用できる非常に貴重なコレクションの1つであるArrayListです。

の代わりに

Integer[] ints = new Integer[x]

あなたが使う

List<Integer> ints = new ArrayList<Integer>();

そして、あなたが使用してリストを変更するints.add(y)ints.remove(z)、他の多くの便利な方法の中で、あなたが適切なのJavadocで見つけることができます。

Javaで利用できるコレクションクラスは非常に強力であり、Java初心者が不必要に自分自身を書き直そうとする組み込み機能を数多く提供するため、これらを検討することを強くお勧めします。


私が試すまで働きたい:List <Integer> ints = new ArrayList <Integer>();
gorbysbm 2014

5
List<Integer>代わりになぜ使用するのArrayList<Integer>ですか?
Dean Meehan 2016年

24

インスタンス化されると、配列は固定サイズになります。代わりにリストを使用できます。

オートボクシングはリストを配列のように使用できるようにします。それには単純にint値を入れることができます:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
ArrayListではなくList型の参照変数を宣言するのはなぜですか?
LppEdd 2015

2
必要に応じて、List実装を簡単に切り替えることができるため、新しいXYZList()を変更するだけで済みます。変数がArrayListとして宣言されている場合、oyuはこの実装に固有のメソッドを使用する可能性があり、変更がより複雑になります。
Mnementh 2015

1
ありがとう、わかりました。
LppEdd 2015

11

は動的配列ではなく、配列に基づくリストArrayListであるため、が示唆する以前の回答に同意しません。違いは、以下を実行できないことです。ArrayList

ArrayList list = new ArrayList(4);
list.put(3,"Test");

バッキング配列がそのような追加を許可する場合でも、この位置にはまだ要素がないため、IndexOutOfBoundsExceptionを提供します。したがって、@ randy-lanceによって提案されているようなカスタムの拡張可能な配列実装を使用する必要があります



Java8のソースコードにあるように、ArrayListにputメソッドがあるかどうかはわかりません。与えられた容量でどのように動作するかを調べようとするだけです。ただし、ArrayList.add()メソッドが見つかりました。
Sanjeet A 2016

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

ソース:動的配列の作り方


7
  1. 小さいスケールサイズを処理するには、リストを使用することをお勧めします。

  2. あなたは数字の膨大な数を持っている場合は、絶対に、リストやオートボクシングを使用していません

    リスト<整数>リスト

すべてのintに対して、新しいIntegerが自動的に作成されます。リストのサイズが増えると、速度が遅くなります。これらの整数は不要なオブジェクトです。この場合、推定サイズを使用する方が良いでしょう。

int[] array = new int[ESTIMATED_SIZE];


4

配列のサイズは変更できません。ただし、適切なサイズの新しい配列を作成し、古い配列から新しい配列にデータをコピーすることはできます。

ただし、最善のオプションは、ジャカルタコモンズのIntListを使用することです。(ここ

Listと同じように機能しますが、ラッパーオブジェクトをintに格納する代わりにintを格納するため(Integerクラスと同じです)、必要なスペースが少なく効率的です。


-4

私はこの質問に答えましたが、配列リストやこれが割り当てであった他のことは必要ありません。私はそれを完了したので、配列のサイズを増やすことができます。これは、 Java Dynamic Arrayの使用方法 のリンクと、Java Dynamic配列に回答した私の質問のリンクです


1
これは間違っています。リンクされた回答はSystem.arrayCopy()を呼び出し、古い配列をサイズを増やした新しい配列にコピーしてから、新しいエントリを追加します。配列はまだ動的なサイズを持つことができません。
katzenhut 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.