ホームページ > Java > &#&チュートリアル > Java リストの究極ガイド: 知っておくべきことすべて

Java リストの究極ガイド: 知っておくべきことすべて

Linda Hamilton
リリース: 2024-11-26 03:01:14
オリジナル
272 人が閲覧しました

The Ultimate Guide to Lists in Java: Everything You Need to Know

  1. そもそも、リストとは何ですか? リストとは、Java 開発者が混沌とした世界の秩序を維持するために使用する、よく整理された神秘的な巻物であると考えてください。これはシーケンス内の要素を保持するコレクションの一種で、重複を許可し、挿入順序を維持します。ただし、そのシンプルさに騙されないでください。List は、さまざまなシナリオに適した複数の機能を備えた非常に強力なツールです。

  1. なぜリストが必要なのでしょうか? 一連の ToDo を管理していると想像してください。確かに配列を使用することもできますが、途中にタスクを挿入する必要がある場合はどうなるでしょうか?配列は丁寧にシフトしません。彼らはコンサートでの頑固な友達のようなものです。ここでリストが登場します:
  2. 動的サイズ : 配列とは異なり、リストは必要に応じて拡大または縮小できます。
  • 順序付け : 要素は挿入順序を保持します。

  • 柔軟性 : 重複が許可されるため、上司のリマインダーと同じように繰り返し行うことができます。


  1. Java のリストの種類 Java は 1 種類のリストだけにとどまりません。ビュッフェ全体を提供しています。 配列リスト
  2. Backed By : 動的配列。
  • 最適な用途 : 高速なランダム アクセスと反復。

  • 欠点 : 挿入と削除が遅い (要素を移動する必要があるため)。

  • ユースケース : メディア プレーヤーでビデオ フレームを取得するなど、要素に頻繁にアクセスする必要がある場合。

List<String> arrayList = new ArrayList<>();
arrayList.add("First");
arrayList.add("Second");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

メモリ レイアウト : ArrayList は連続したメモリ ブロックを維持し、容量を超えると 50% 以上サイズ変更されます。 リンクリスト

  • Backed By : 二重リンクリスト。

  • 最適な用途 : 頻繁な挿入と削除。

  • 欠点 : ポインタのトラバーサルによりアクセス時間が遅くなります。

  • ユースケース : 曲が頻繁に追加または削除されるプレイリストを実装します。

List<String> linkedList = new LinkedList<>();
linkedList.add("Node1");
linkedList.add("Node2");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

メモリ レイアウト : LinkedList は、各ノードが前後のノードを指す不連続メモリを使用します。c. CopyOnWriteArrayList

  • 特別な目的 : ArrayList のスレッドセーフなバリアント。

  • 仕組み : 変更のたびに、基になる配列の新しいコピーを作成します。

  • 最適な用途 : 読み取り数が書き込み数を大幅に上回るシナリオ (頻繁にアクセスされるデータのキャッシュなど)。

  • 欠点 : メモリを大量に消費し、更新に時間がかかります。
    d. ベクトル

  • レガシー : Java 1.0 で導入されました。

  • スレッド セーフ : 同期オーバーヘッドにより、最新の代替手段よりも遅くなります。

  • 面白い事実 : リストの「お父さんジョーク」のようなものです。それほど面白くありませんが、まだぶらぶらしています。


  1. Java でのリストの作成 Java では、特定のニーズに合わせてリストを作成する複数の方法が提供されています。
  2. 直接インスタンス化 :
List<String> arrayList = new ArrayList<>();
arrayList.add("First");
arrayList.add("Second");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • Arrays.asList() の使用 :
List<String> linkedList = new LinkedList<>();
linkedList.add("Node1");
linkedList.add("Node2");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

: これは固定サイズのリストを返すため、要素を追加または削除することはできません。

  • 不変リスト (Java 9):
List<String> list = new ArrayList<>();
ログイン後にコピー
ログイン後にコピー

不変とは、add()、remove()、clear() がないことを意味します。たとえば、誰にも芝生に触れさせない隣人のようなものです。


  1. リストインターフェイスの一般的なメソッド 一般的な方法とその実際の使用例の内訳は次のとおりです。 a. add(E e) リストの最後に要素を追加します。
List<String> list = Arrays.asList("A", "B", "C");
ログイン後にコピー
ログイン後にコピー

b. add(int インデックス, E 要素)
指定されたインデックスに要素を挿入し、後続の要素を移動します。

List<String> immutableList = List.of("X", "Y", "Z");
ログイン後にコピー
ログイン後にコピー

c.削除(int インデックス)
指定されたインデックスにある要素を削除します。

list.add("Element");
ログイン後にコピー
ログイン後にコピー

d. get(int インデックス)
指定されたインデックスにある要素を取得します。

list.add(1, "Middle");
ログイン後にコピー

e。 set(int インデックス, E 要素)
指定された位置の要素を新しい要素に置き換えます。

list.remove(0);
ログイン後にコピー

  1. リストが内部的にどのように機能するか a. ArrayList の内部 ArrayList は、スペースがなくなるとサイズが 2 倍になる魔法のコンテナのようなものです。このサイズ変更は O(n) 時間で行われますが、その後の追加は O(1) で行われます。内部では、Object[] 配列が使用されます。Diagram :
String element = list.get(2);
ログイン後にコピー

サイズ変更時:

list.set(1, "UpdatedElement");
ログイン後にコピー

b. LinkedList の内部 LinkedList の各要素 (ノード) には以下が含まれます:

  • データ

  • 次のノードへのポインタ

  • 前のノードへのポインタ (二重リンクリスト内)

インデックスへのアクセスにはノードを反復処理する必要があるため、トラバーサルは遅くなります。
:

[Element1] [Element2] [Element3] [Null] ... [Null]
ログイン後にコピー

  1. リストを使用したアルゴリズム 並べ替えアルゴリズム :
  2. Collections.sort() : マージ ソートと挿入ソートのハイブリッドである TimSort を使用します。
  • カスタム コンパレータ : カスタム ロジックに基づいて並べ替えます。
[Element1] [Element2] [Element3] [NewElement] [Null] ... [Null]
ログイン後にコピー

検索アルゴリズム :

  • 線形検索 : O(n) – 各要素をスキャンします。

  • 二分探索 : O(log n) – ソートされたリストが必要です。

List<String> arrayList = new ArrayList<>();
arrayList.add("First");
arrayList.add("Second");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

  1. メモリの割り当てと効率 ArrayList 要素は連続したブロックに格納されるため、反復処理は高速になりますが、サイズ変更時のメモリ オーバーヘッドは小さくなります。一方、LinkedList は、各要素をポインターを使用して個別のノードに保存するため、挿入パフォーマンスは向上しますが、ポインターによりメモリ使用量が増加します。

  1. リストの処理に関するヒントとテクニック
  2. ConcurrentModificationException を避ける : 反復中にリストを変更する場合は、Iterator または ListIterator を使用します。
  • 関数型プログラミングにストリームを使用する :
List<String> linkedList = new LinkedList<>();
linkedList.add("Node1");
linkedList.add("Node2");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • バッチ操作 : 大規模な変更の場合は、パフォーマンスを向上させるために addAll()、removeAll()、または RetainAll() を優先します。

  1. リストに最適な問題の特定 セットやキューなどではなく、いつリストに手を伸ばすべきでしょうか?
  2. 広告掲載オーダーを維持 : 常に。
  • 重複を許可します : 絶対にそうします。

  • 頻繁なアクセス操作 : Go ArrayList.

  • 頻繁な変更 : LinkedList に移動します。


  1. 高度なテクニック
  2. リストを反転します :
List<String> list = new ArrayList<>();
ログイン後にコピー
ログイン後にコピー
  • シャッフル要素 :
List<String> list = Arrays.asList("A", "B", "C");
ログイン後にコピー
ログイン後にコピー
  • 同期リスト :
List<String> immutableList = List.of("X", "Y", "Z");
ログイン後にコピー
ログイン後にコピー
  • パフォーマンスのための並列ストリーム :
list.add("Element");
ログイン後にコピー
ログイン後にコピー

  1. よくある間違いとベストプラクティス
  2. NullPointerException に注意してください : 操作の前に、リストが null かどうかを必ず確認してください。
  • ジェネリックを使用 : ClassCastException を回避するには、常に型を指定します。

  • ループ内で new ArrayList<>() を使用しないでください : OutOfMemoryError を避けるためにインスタンスを再利用するか、適切に管理してください。


結論: リストウィスパラーになろう!

List を徹底的に理解すると、効率的でスケーラブルで読みやすい Java プログラムを作成できるようになります。これは、グルメ レシピに取り掛かる前に料理の基本をマスターするようなものです。コードが焼ける (そしてトーストが焼ける) のを防ぐことができます。サンプルを自由に試し、カスタム シナリオを作成し、List の機能を活用してください。そして、経験豊富な開発者は、ライフとリストの両方ですべての要素が重要であることを知っていることを忘れないでください。


さあ、新たに習得したリストの習得でコーディングの課題を克服し、配列に振り回されることはもうありません!

以上がJava リストの究極ガイド: 知っておくべきことすべての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート