CodeGym /Java Blog /ランダム /Java 配列リスト
John Squirrels
レベル 41
San Francisco

Java 配列リスト

ランダム グループに公開済み
やあ!前のレッスンでは、配列について詳しく調べ、配列を操作する一般的な例を確認しました。このレッスンでは、Java ArrayList について詳しく見ていきます。一般に、配列は非常に便利です。そして、すでにお気づきのとおり、配列を使用して多くのことができます :) しかし、配列には多くの欠点があります。
  • サイズに限りがあります。配列を作成するときに、配列に含める必要がある要素の数を知っておく必要があります。過小評価すると、十分なスペースが確保できなくなります。過大評価すると配列が半分空のままになり、これも良くありません。結局のところ、依然として必要以上のメモリを割り当てていることになります。

  • 配列には要素を追加するメソッドがありません。要素を追加する位置のインデックスを常に明示的に指定する必要があります。必要な値が占める位置のインデックスを誤って指定した場合、そのインデックスは上書きされます。

  • アイテムを削除する方法はありません。値は「ゼロにする」ことのみ可能です。

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");

       cats[1] = null;

      
      
       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
出力: [Cat{name='Thomas'}, null, Cat{name='Lionel Messi'}] 幸いなことに、Java の作成者は配列の長所と短所をよく知っており、そのためJava ArrayListと呼ばれる非常に興味深いデータ構造を作成しました。できるだけ簡単に言うと、Java ArrayList は、多くの新機能を備えた「強化された」配列です。

ArrayList を作成する方法

作成は非常に簡単です。

ArrayList<Cat> cats = new ArrayList<Cat>();
これで、 Catオブジェクト を保存するためのリストが作成されました。ArrayList は自動的に拡張できるため、そのサイズを指定していないことに注意してください。これはどのようにして可能でしょうか? 実はとてもシンプルなのです。驚かれるかもしれませんが、Java の ArrayList はごく普通の配列の上に構築されています :) はい、配列が含まれており、そこに要素が保存されます。ただし、 Java のArrayListには、その配列を操作するための特別な方法があります。
  • 内部配列がいっぱいになると、ArrayList は内部的に新しい配列を作成します。新しい配列のサイズは、古い配列のサイズに 1.5 を加えたものになります。

  • すべてのデータが古いアレイから新しいアレイにコピーされます

  • 古い配列はガベージ コレクターによってクリーンアップされます。
このメカニズムにより、Java ArrayList (通常の配列とは異なり) で新しい要素を追加するメソッドを実装できるようになります。それはadd()方法 です

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Behemoth"));
}
新しい項目はリストの最後に追加されます。これで、配列がオーバーフローする危険性がなくなり、この方法は完全に安全になります。ちなみに、ArrayList はインデックスによってオブジェクトを検索できるだけでなく、その逆も可能です。参照を使用して ArrayList 内のオブジェクトのインデックスを検索できます。これが、indexOf()メソッドの目的です。必要なオブジェクトへの参照を渡し、indexOf()はそのインデックスを返します。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
出力: 0 そうです。私たちのthomasオブジェクトは確かに要素 0 に格納されています。配列には欠点があるだけではありません。それらには疑いの余地のない利点もあります。その 1 つは、インデックスによって要素を検索する機能です。インデックス、つまり特定のメモリ アドレスを指すため、この方法で配列を検索するのは非常に高速です。ArrayListやり方も知っています!get ()メソッドはこれを実装します。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
出力: Cat{name='Behemoth'}さらに、 ArrayListに特定のオブジェクトが含まれている かどうかを簡単に確認できます。これは、 ArrayList contains() メソッドを使用して行われます。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   cats.remove(fluffy);
   System.out.println(cats.contains(fluffy));
}
このメソッドは、ArrayListの内部配列に要素が含まれているかどうかを確認し、ブール値(true または false) を返します。出力: false そして、挿入に関するもう 1 つの重要なことがあります。 ArrayList を使用すると、インデックスを使用して、配列の末尾だけでなく任意の場所に要素を挿入できます。 これには 2 つの方法があります。
  • ArrayList add(int インデックス, Cat 要素)
  • ArrayListセット(int インデックス、Cat 要素)
これらのメソッドはどちらも引数として、挿入する位置のインデックスとオブジェクト自体への参照を受け取ります。違いは、set()を使用して挿入すると古い値が上書きされることです。add()を使用して挿入すると、まず [index] から配列の末尾までのすべての要素が 1 つシフトされ、結果として得られる空の位置に指定されたオブジェクトが追加されます。

以下に例を示します。


public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using set

   System.out.println(cats.toString());
}
出力: [[Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Behemoth'}] 2 匹の猫のリストがありました次に、 set()メソッドを使用して別の要素を要素 0 として挿入しました。その結果、古い要素は新しい要素に置き換えられました。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using add

   System.out.println(cats.toString());
}
ここで、add()の動作が異なることがわかります。すべての要素を右に移動し、新しい値を要素 0 として書き込みます。 出力: [Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Thomas'}, Cat{name='Behemoth'}] リストを完全にクリアするには、clear()メソッドを使用します。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   cats.clear();

   System.out.println(cats.toString());
}
出力: [] リストからすべてが削除されました。ちなみに、配列とは異なり、ArrayList はtoString()メソッドをオーバーライドし、すでにリストを文字列として適切に表示していることに注意してください。通常の配列の場合、これにはArraysクラスを使用する必要がありました。そして、 Arraysについて述べたので、Java では配列とArrayList を簡単に「切り替える」ことができます。つまり、配列と ArrayListを別の配列に変換できます。Arraysクラスには、これを行うためのArrays.asList()メソッドがあります。これを使用して内容を配列として取得し、ArrayListコンストラクターに渡します。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   Cat[] catsArray = {thomas, behemoth, lionel, fluffy};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
出力: [Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}] 逆の方向に進むこともできます: get ArrayListオブジェクトからの配列。これはtoArray()メソッドを使用して行います。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
注: 空の配列をtoArray()メソッドに渡しました。これはエラーではありません。ArrayListクラス内では、このメソッドは空の配列を渡すとパフォーマンスが向上するような方法で実装されます。将来のためにこれを覚えておいてください (もちろん、特定のサイズの配列を渡すこともできます。それも機能します)。ああ、サイズについて。リストの現在のサイズは、size()メソッドを使用して確認できます。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   System.out.println(cats.size());
}
配列の長さプロパティとは異なり、ArrayList.size()メソッドは元の容量ではなく実際の要素数を返すことを理解することが重要です。結局のところ、ArrayListを作成するときにサイズを指定しませんでした。ただし、ArrayListには適切なコンストラクターがあるため、指定することはできます。ただし、新しい要素を追加するという点では、動作は変わりません。

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);// create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   System.out.println(cats.size());
}
コンソール出力: 4 2 つの要素のリストを作成しましたが、必要に応じて静かに拡張されました。もう 1 つの考慮事項は、最初に非常に小さなリストを作成すると、より頻繁に拡張する必要があり、リソースを使用することになります。このレッスンでは、 ArrayListから要素を削除するプロセスについてはほとんど触れませんでした。もちろん、これは忘れていたからではありません。このトピックは、後で説明する別のレッスンにまとめました :) 学んだ内容を強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION