投稿 2022年3月21日
更新 2022年4月30日
専門用語の数:少
ざっくりいうと、順番通りに並べることができるデータのことです。
「ラーメン屋に並ぶ人の列」的なイメージです。
並ぶときは最後尾から並ぶ、途中で抜けたら順番を詰められる
呼ばれるときは名前は知らないので、次の方とか何番目の方とかで呼ばれたり、
だいたいそんな感じです。
まぁかたくるしく言うと、順番で管理された重複可能なコレクションです。
もう何語ですか?って感じですね。
Listに似たようなものとして、「配列」というのがあります。
配列とListの違いは、配列は入れることができる数が決められていて、
Listは何個でも入れることができるという違いです。
さらにListに関しては、非常に便利な機能がいっぱい搭載されています。
そのため配列でやろうとすると、面倒くさい処理を一発でできたりもします。
じゃ配列のメリットなくね?
となりますが、もちろん配列は配列でメリットがあるので、
どちらかが劣っていてどちらかが優れているというよりは
時と場合によってどちらのほうが向いているか
ということを考えないといけないです。
さっきからList、Listと言ってますが、
実はListとはあくまで入れ物のようなもの(インターフェース)なだけで、
実際に動作する実物は以下の二種類あります。
中身を見に行くスピードが速い
中身を追加したり削除するスピードが遅い
中身を見に行くスピードが遅い
中身を追加したり削除するスピードが速い
中身を変更することが多い場合はLinkedListを使用し、
それ以外は基本的にArrayListを使用しておけば、だいたいは最適化されるはずです。
正直LinkedListの知名度が低いので、どちらか迷うようなら
可読性も上がるので、ArrayListを使用しておいたほうがいいと思います。
一般的に下記のような宣言を見ることが多いかと思います。
このように、Listの中に実物を入れていることが多いと思います。
ただ同じ型に入れることももちろん可能です。
どう違うのかと言うと、使える機能が違います。
細かくいえば他にも違いはありますが、基本的にはListのインターフェースに格納し、
必要に応じてインターフェースに無い機能を使いたい時だけArrayList等を使用するイメージで大丈夫だと思います。
そのため以下は全てListに格納しております。
まずListの中身のことは「要素」と呼びます。
そしてややこしいですが、インデックス(管理番号のようなもの)は0から数えます。
なので、1番目(最初)が0、2番目が1、のようになります。
Listオブジェクトを初期化(生成)します。
基本的に引数は指定しなくてもいいですが、「初期容量」を指定できます。
何かというと、オブジェクト生成時にまず、初期容量分の保存領域を確保します。
そして要素を追加していく中で、初期容量の負荷係数個に到達すると、保存領域を拡張します。
この要領を拡張するという動作が非常に重たい動作になるので、できる限り最適に設定していきたいので、
最初からある程度量が分かっているのであれば、指定してあげるとパフォーマンスがよくなります。
佐藤・鈴木のように、通常は最後に要素を追加しますが、
田中のように追加する場所を指定すれば、任意の位置に要素を追加できます。
引数に「1」を指定すれば2番目の位置に追加し、
すでにあった2番目の要素以降はすべて1つ後ろにずれます。
インデックスを指定して削除をするか、
要素を指定して削除を行います。
削除した要素以降の要素は、詰めるように1つ手前にずれます。
インデックスを指定して、要素を取得します。
インデックスを指定して、すでにある要素を変更します。
List内の要素の数を取得します。
取得できる数は人間が数える数字と同じなので、
1個、2個と数えるやり方と同じです。
そのため、要素数を使ってインデックスを指定するのであれば
-1しないといけません。
Listに要素があるかどうかを判定します。
ただし完全一致しないと存在しないと判定されます。
例だと「佐藤」に「藤」は含まれてはいますが、
完全一致はしないので、containsはfalseを返します。
上のほうで基本的な使い方で紹介した「contains」は、
完全一致しか検索ができません。
そのため一部だけ一致しないようなものを検索したければ、
独自で検索するしかありません。
Listの中身を1つ1つ確認していって、
検索したいものが含まれているかどうかを見ています。
ちなみに「indexOf」のように、含まれているかどうかの処理は、
変数の型によったり、やり方が異なる可能性があるのでご注意ください。
昇順や降順で並び替えるには、
「Collections」の「sort」機能を使います。
並び替えたいListだけ指定して使うと昇順になり、
さらに「reverseOrder」を指定すると降順に並び替えます。
今回はわかりやすいように数字で行いましたが、
文字列でも並び替えることはできます。
アルファベット、ひらがな、カタカナは、
おそらく想定する順番になるかと思いますが、
注意すべきは漢字です。
並び替える基準が文字コード順に並び替えられているのです。
文字コードが何かわからないと思いますが、
文字一つ一つに管理番号みたいなのが振り分けられていて、
その順番で並び替えられるので、
漢字に関しては順番がぐちゃぐちゃになるかと思います。
日本語でもひらがなやカタカナがうまくいくのは、
文字コードが順番通りになっているからです。
ループ回数によって、奇数番目と偶数番目を判定して、
処理を分けるようなことをしています。
またややこしいですが、インデックスは0からなので、
人間が数える奇数番目が、インデックスでいう偶数になります。
ループ回数を2で割って、余りが0なら偶数という判定です。
交互に処理を変えたいときとかに使用します。
Javaのコレクションの「List」の紹介でした。
Listに限らずにJavaのコレクションを使いこなせれば、
楽に処理を実装できますし、わかりやすく書けますので、WinWinです。
使いこなせれば世界が変わるといっても過言ではないと思います!
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。
コメント一覧