JavaRush /Java Blog /Random-JA /JavaのArrayListクラス

JavaのArrayListクラス

Random-JA グループに公開済み
こんにちは!これまでの講義では、配列などのデータ構造を詳細に調べ、それらを操作する一般的な例を見ていきました。しかし、このデータ構造には多くの欠点があります。Java におけるそれらに対する答えは ArrayList の登場でした。できるだけ簡単に言うと、Java の ArrayList は、多くの新機能を備えた「アップグレードされた」配列です。クラス配列リスト - 1

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("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;



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

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
結論:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
これらの欠点はすべて ArrayList を使用することで解消できます。非常に簡単に作成されます。
ArrayList<Cat> cats = new ArrayList<Cat>();
これで、オブジェクトを保存するためのリストが作成されましたCat注意してください:ArrayList は自動的に拡張可能であるため、ArrayList のサイズは指定しません。これはどのようにして可能でしょうか? 簡単に。驚かれるでしょうが、ArrayList は通常の配列に基づいています :) はい、その中には要素が格納される配列があります。ただし、ArrayList には、それを操作するための特別なメカニズムがあります。
  • この内部配列がいっぱいになると、ArrayList はそれ自体内に新しい配列を作成します。そのサイズ = (古い配列のサイズ * 1.5) +1。
  • すべてのデータが古いアレイから新しいアレイにコピーされます
  • 古い配列はガベージ コレクターによって削除されます。
このメカニズムのおかげで、ArrayList (配列ではなく) は新しい要素を追加するメソッドを実装します。これはメソッドですadd()
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
新しい要素がリストの最後に追加されます。現在はオーバーフローの危険がないため、このメカニズムは完全に安全です。ちなみに、ArrayList はインデックスによってオブジェクトを検索できるだけでなく、その逆も可能です。オブジェクトを参照することで ArrayList 内のオブジェクトのインデックスを見つけることができます。これを行うために、メソッドを実装しますindexOf()。目的のオブジェクトへのリンクをそれに渡し、indexOf()そのインデックスを返します。
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
結論:

0
そうです、オブジェクトはthomas実際には cell に格納されています0。アレイには欠点だけではなく、疑いのない利点もあります。その 1 つは、インデックスによる要素の検索です。インデックス、つまりメモリ内の特定のアドレスを指すため、このような配列検索は非常に高速です。Java の ArrayList もこれを行うことができます。これを行うために、次のメソッドを実装しますget()
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
結論:

Cat{name='Бегемот'}
また、ArrayList に特定のオブジェクトが含まれているかどうかを簡単に確認できます。これは次のメソッドを使用して行われますcontains()
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
このメソッドは、要素が ArrayList の内部配列に含まれているかどうかを確認し、結果をboolean-trueまたは の形式で返しますfalse。結論:

false
そして挿入に関してもう一つ重要なことがあります。ArrayList を使用すると、配列の末尾にデータを挿入するだけでなく、インデックスを使用して任意のセルにデータを挿入することもできます。これには 2 つの方法があります。
  • add(int index, Cat element)
  • set(int index, Cat element)
両方に、挿入先のセルのインデックスとオブジェクト自体へのリンクを渡します。違いは、ペーストスルーすると、set()セルに格納されている古い値が上書きされることです。そして、add()最初に挿入すると、配列の最初から最後まですべての要素がシフトされ[index]、結果として得られる空のセルに必要なオブジェクトが追加されます。以下に例を示します。
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

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

   cats.set(0, philipp);//Now we have a list of 2 cats. We add the 3rd via set:

   System.out.println(cats.toString());
}
結論:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
2 匹の猫のリストがあったので、メソッドを使用して別の猫をset()セルに挿入しました0。その結果、このセルに格納されている古い値は新しい値に置き換えられました。
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

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

   cats.add(0, philipp);//Now we have a list of 2 cats. Add the 3rd via add

   System.out.println(cats.toString());
}
しかし、それはadd()違った働きをしました。彼はすべての要素を右にシフトし、新しい値をセルに書き込みました0。結論:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
リストを完全にクリアするには、次のメソッドを使用しますclear()
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   cats.clear();

   System.out.println(cats.toString());
}
結論:

[]
すべてのコンテンツがリストから削除されました。ちなみに、配列とは異なり、ArrayList では toString() メソッドがオーバーライドされ、リストが文字列形式で即座に表示されることに注意してください。配列の場合、これには Arrays クラスを使用する必要がありました。そして、配列について思い出したので、Java では配列と ArrayList を簡単に「切り替える」ことができます。つまり、一方を他方に変換できます。Arrays クラスには、このためのメソッド Arrays.asList() があります。その助けを借りて、配列の内容をリストとして取得し、それを ArrayList のコンストラクターに渡します。
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
結論:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
逆に、ArrayList オブジェクトから配列を取得することもできます。これを行うには、 toArray() メソッドを使用します。
public static void main(String[] args) {

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

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   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("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   System.out.println(cats.size());
}
ここで、配列プロパティとは異なり、ArrayList.size() メソッドは初期容量ではなく正確な要素数を返すことを理解することが重要です。lengthこれは、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("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

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

   System.out.println(cats.size());
}
コンソール出力:

4
2 つの要素を含むリストを作成しましたが、必要なときに簡単に拡張できました。もう 1 つは、最初に非常に小さなリストを作成した場合、拡張操作をより頻繁に実行する必要があり、これにより一定量のリソースが消費されることです。この講義では、ArrayList から要素を削除するプロセスについてはほとんど触れませんでした。もちろん、これは物忘れが原因ではありません。このトピックは別のレクチャーに分かれているので、さらに読むことができます :)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION