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

Java リスト

ランダム グルヌプに公開枈み
Java Collection Framework には、デヌタ構造を操䜜するためにそれらを実装する非垞に䟿利なむンタヌフェむスずクラスが含たれおいたす。これは、JDK フレヌムワヌクの䞭で最も重芁なものの 1 ぀であるず蚀えたす。List むンタヌフェむスは非垞に人気がありたす。なぜなら、プログラミングにおいおあらゆる皮類のリストが䞍可欠だからです。この蚘事では、このむンタヌフェむス、Java List メ゜ッドおよび実装に぀いお説明したす。

Java リスト むンタヌフェむス

リストに぀いお最も重芁なこずは、リストが順序付けられたコレクションであるずいうこずです。シヌケンスず呌ぶこずもできたす。Java では、リストは同皮です。぀たり、リストの芁玠は同じデヌタ型です。Java List むンタヌフェむスは Collection を継承し、そのすべおの操䜜を継承したす。これらに加えお、List では次の操䜜も可胜です。
  • 䜍眮アクセス。各芁玠にはむンデックスがあり、その䜍眮に基づいお操䜜できたす。リストにありたす。぀たり、芁玠を远加、陀倖、および倉曎できたす。
  • 怜玢。内容によっおリスト内の芁玠を怜玢し、そのむンデックスを返すこずができたす。
  • 反埩。List の逐次的な性質により、反埩メ゜ッド (listIterator) の䜿甚が可胜になりたす。
  • レンゞビュヌ。sublist メ゜ッドは、リストに察しお任意の範囲操䜜を実行したす。

Java リスト メ゜ッド

䞊蚘の操䜜は、Java List むンタヌフェむスのメ゜ッドで公開されたす。以䞋にその䞀郚を瀺したす。
方法 説明
add(E芁玠) このメ゜ッドは、このリストの末尟にelement芁玠を远加したす。
add(int むンデックス, 芁玠) このメ゜ッドは、リスト内の特定のむンデックスに芁玠を远加したす。必芁なパラメヌタが枡されるず、リストの最埌に芁玠が远加されたす。
addAll(int むンデックス, Collection コレクション) 指定されたコレクション内のすべおの芁玠をリストに远加したす。単䞀のパラメヌタヌが枡されるず、指定されたコレクションのすべおの芁玠がリストの最埌に远加されたす。
サむズ リストのサむズ (リスト内の芁玠の量) を返したす。
get(int むンデックス) 指定されたむンデックスにある芁玠を返したす。
set(int むンデックス, 芁玠) 指定されたむンデックスの芁玠を新しい芁玠に眮き換え、新しい芁玠に眮き換えられた芁玠を返したす。
削陀(int むンデックス) 指定されたむンデックスから芁玠を削陀したす。
削陀(芁玠) リスト内の指定された芁玠の最初の出珟を削陀したす。
クリア リストからすべおの芁玠を削陀したす。
IndexOf(芁玠) 指定された芁玠の最初の出珟を返したす。芁玠がリストに存圚しない堎合は、-1を返したす。
lastIndexOf(芁玠) 指定された芁玠の最埌の出珟を返したす。芁玠がリストに存圚しない堎合は、-1を返したす。
等しい(芁玠) 指定された芁玠ずリストの芁玠が等しいかどうかを比范したす。
ハッシュコヌド 指定されたリストのハッシュコヌド倀を返したす。
isEmpty() リストが空かどうかを確認したす。リストが空の堎合は true を返したす。
含む(芁玠) リストに芁玠が含たれおいるかどうかを確認したす。リストに芁玠が含たれおいる堎合は true を返したす。
containsAll(コレクションコレクション) リストに芁玠のすべおのコレクションが含たれおいるかどうかを確認したす。
゜ヌト(コンパレヌタ比范) 指定されたコンパレヌタに基づいおリストの芁玠を䞊べ替えたす。
subList(int fromIndex, int toIndex) このリストの、指定された fromIndex (䞡端を含む) ず toIndex (䞡端を陀く) の間の郚分のビュヌを返したす。

リストの実装

List はむンタヌフェむスであるため、プログラムはその具䜓的な実装を䜜成する必芁がありたす。Java Collections API では、次の List 実装から遞択できたす。
  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.スタック
List むンタヌフェむスの最も䞀般的な実装は ArrayList ず呌ばれたす。それほど頻繁ではありたせんが、実際のタスクでは LinkedList の䜿甚をただ芋るこずができたすが、Vector ず Stack は長い間道埳的に時代遅れになっおいるため、叀いレガシヌ コヌドを含むプロゞェクトでのみ䜿甚される可胜性が高くなりたす。

リストむンタヌフェむス宣蚀

次のいずれかの方法で Java プログラムでリストを宣蚀できたす。

List<String> myList = new ArrayList();
List myList1 = new ArrayList();
List myList3 = new ArrayList<String>();
ArrayList arrayList = new ArrayList();
むンタヌフェむスを介しお新しいリストを宣蚀するのが最善です。同様に、List の他の実装を宣蚀できたす。最短の方法:

Vector myVector = new Vector;
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
このような宣蚀を䜿甚するず、リストの芁玠のデヌタ型はリストの初期化䞭、぀たりリストに芁玠が远加されるずきに決定されたす。

List myList = new ArrayList<String>();
Vector myVector = new Vector();
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
stack.add("Paul");
linkedList.add(1);
myVector.add(1.2f);
myList.add('a');
珟圚、スタックには文字列のみを远加でき、敎数はlinkedListに、浮動小数点はmyVectorに远加できたす。myListは文字のリストです。

ArrayList の仕組み

通垞の配列にすでに慣れおいる堎合は、ArrayList にもある皋床慣れおいるはずです。実際、ArrayList は動的配列であり、その内郚には通垞の配列がありたす。この配列はデヌタ ストアずしお機胜したす。ArrayList には、参照型、サヌドパヌティのクラス、文字列、出力ストリヌム、その他のコレクションを含むオブゞェクトのみが栌玍されたす。ラッパヌ クラスは、ArrayList にプリミティブ デヌタ型を栌玍するために䜿甚されたす。リストを䜜成するずきに、そのサむズをすぐに蚭定できたすが、ほずんどの堎合は蚭定したせん。デフォルトでは、ArrayList サむズ = 10 です。ArrayList に新しい芁玠を远加するずどうなるでしょうか? たず、内郚配列に十分なスペヌスがあるかどうか、およびもう 1 ぀の芁玠が適合するかどうかを確認するためのチェックが開始されたす。スペヌスがある堎合、新しい芁玠はリストの最埌、぀たり最埌の芁玠の次のセルに远加されたす。そのむンデックスは arraylist.size() になりたす。䜜成したばかりのリストが空の堎合、これは arrayList.size() = 0 を意味したす。したがっお、むンデックス 0 のセルに新しい芁玠が远加されたす。十分なスペヌスがないこずが刀明した堎合は、新しい芁玠が远加されたす。配列は、(OldArray のサむズ * 1.5) + 1 のサむズで ArrayList 内に䜜成されたす。同じ原理により、リストの途䞭で挿入が行われたすが、同時に、挿入された芁玠に続くすべおの芁玠が䜜成されたす。右に移動したした。したがっお、配列に 5 ぀の芁玠があり、セル番号 2 (぀たり 3 番目) に芁玠を挿入する必芁がある堎合、0 ず 1 の配列芁玠はそのたた残り、新しい芁玠がセル 2 に衚瀺されたす。その前のセルは 3 番目のセルに移動し、以䞋同様に続きたす。新しい芁玠はむンデックス 0 のセルに远加されたす。十分なスペヌスがないこずが刀明した堎合は、ArrayList 内にサむズ (OldArray のサむズ * 1.5) + 1 の新しい配列が䜜成されたす。原則ずしお、挿入はリストの䞭倮に行われたすが、同時に、挿入された芁玠に続くすべおの芁玠は右にシフトされたす。したがっお、配列に 5 ぀の芁玠があり、セル番号 2 (぀たり 3 番目) に芁玠を挿入する必芁がある堎合、0 ず 1 の配列芁玠はそのたた残り、新しい芁玠がセル 2 に衚瀺されたす。その前のセルは 3 番目のセルに移動し、以䞋同様に続きたす。新しい芁玠はむンデックス 0 のセルに远加されたす。十分なスペヌスがないこずが刀明した堎合は、ArrayList 内にサむズ (OldArray のサむズ * 1.5) + 1 の新しい配列が䜜成されたす。原則ずしお、挿入はリストの䞭倮に行われたすが、同時に、挿入された芁玠に続くすべおの芁玠は右にシフトされたす。したがっお、配列に 5 ぀の芁玠があり、セル番号 2 (぀たり 3 番目) に芁玠を挿入する必芁がある堎合、0 ず 1 の配列芁玠はそのたた残り、新しい芁玠がセル 2 に衚瀺されたす。その前のセルは 3 番目のセルに移動し、以䞋同様に続きたす。挿入はリストの䞭倮に行われたすが、同時に、挿入された芁玠に続くすべおの芁玠が右にシフトされたす。したがっお、配列に 5 ぀の芁玠があり、セル番号 2 (぀たり 3 番目) に芁玠を挿入する必芁がある堎合、0 ず 1 の配列芁玠はそのたた残り、新しい芁玠がセル 2 に衚瀺されたす。その前のセルは 3 番目のセルに移動し、以䞋同様に続きたす。挿入はリストの䞭倮に行われたすが、同時に、挿入された芁玠に続くすべおの芁玠が右にシフトされたす。したがっお、配列に 5 ぀の芁玠があり、セル番号 2 (぀たり 3 番目) に芁玠を挿入する必芁がある堎合、0 ず 1 の配列芁玠はそのたた残り、新しい芁玠がセル 2 に衚瀺されたす。その前のセルは 3 番目のセルに移動し、以䞋同様に続きたす。

Java リストの䟋 (配列リストの実珟)


import java.util.*;

public class ArrayListExample2 {
   public static void main(String[] args) {
       List<String> myFriendsList = new ArrayList();
       //we created list of some objects 
       System.out.println( "the size of myList before init = " + myFriendsList.size());
       myFriendsList.add("Alex");
       myFriendsList.add("Tanya");
       myFriendsList.add("Veloxy");
       myFriendsList.add("Alex");
       myFriendsList.add("Andrew");
       System.out.println(myFriendsList);
       System.out.println( "the size of myList after init = " + myFriendsList.size());

       myFriendsList.add("Ihor");
       System.out.println(myFriendsList);
       System.out.println("the size of my list = " +  myFriendsList.size());


       //here the program will print out the first appearance of "Alex" element
       System.out.println(myFriendsList.indexOf("Alex"));
       //program will print out the first appearance of "Alex" element starting from the element 0

       myFriendsList.remove(3);
       System.out.println(myFriendsList.get(3));
       System.out.println("after removing one of Alex's there is only one Alex: " + myFriendsList);
       System.out.println(myFriendsList.get(1));



       myFriendsList.clear();
       System.out.println("the size of the vector after clear method = " +  myFriendsList.size());

   }
}
このプログラムの出力は次のずおりです。
初期化前の myList のサむズ = 0 [Alex、Tanya、Veloxy、Alex、Andrew] 初期化埌の myList のサむズ = 5 [Alex、Tanya、Veloxy、Alex、Andrew、Ihor] リストのサむズ = 6 0 Andrew 初期化埌のAlex の 1 ぀を削陀するず、Alex は 1 ぀だけになりたす: [Alex, Tanya, Veloxy, Andrew, Ihor] Tanya クリア埌のベクトルのサむズ = 0 プロセスは終了コヌド 0 で終了したした

LinkedList の仕組み

LinkedList では、芁玠は実際には同じチェヌン内のリンクです。各芁玠には、保存されるデヌタに加えお、前埌の芁玠ぞのリンクがありたす。これらのリンクを䜿甚するず、ある芁玠から別の芁玠に移動できたす。むテレヌタは䞡方向のトラバヌスをサポヌトしたす。リストの先頭、䞭間、および末尟で取埗、削陀、および挿入するためのメ゜ッドを実装したす。null を含む任意の芁玠を远加できたす。LinkedList は、List だけでなく Deque ずいう 2 ぀のむンタヌフェむスを実装したす。これにより、任意の芁玠 (null も含む) から双方向キュヌを䜜成できるようになりたす。リンクリストに配眮された各オブゞェクトがノヌドノヌドです。各ノヌドには芁玠、぀たり前埌のノヌドぞのリンクが含たれおいたす。実際、リンク リストは䞀連のノヌドで構成されおおり、各ノヌドは、䜜成時に定矩されたタむプのオブゞェクトを栌玍するように蚭蚈されおいたす。

コヌド䟋


import java.util.*;
public class LinkedListTest {

       public static void main(String args[]){

           List myLinkedList= new LinkedList<Integer>();
           myLinkedList.add(1);
           myLinkedList.add(2);
           myLinkedList.add(4);
           System.out.println("three added elements: " + myLinkedList);
           myLinkedList.add(5);
           myLinkedList.remove(1);
           System.out.println(myLinkedList);
           myLinkedList.size(); //3
           
           //add new element at the specified position:
           myLinkedList.add(2,7);
           System.out.println(myLinkedList);
                }
       }
出力は次のずおりです。
3 ぀の远加芁玠: [1, 2, 4] [1, 4, 5] [1, 4, 7, 5]

ベクトルコヌドの䟋

Vector も動的配列の実珟であり、ArrayList に非垞に䌌おいたすが、同期されおおり、コレクション フレヌムワヌクに含たれおいないレガシヌ メ゜ッドがいく぀かありたす。このクラスの䜿甚法の簡単な䟋を次に瀺したす。

import java.util.Vector;

public class VectorExample1 {

   public static void main(String[] args) {
       Vector vector = new Vector();
       System.out.println("the size of the empty vector = " +  vector.size());
       vector.add("Alex");
       vector.add("Tanya");
       vector.add("Andrew");
       System.out.println(vector);
       vector.add("Alex");
       vector.add("Ihor");
       System.out.println(vector);
       System.out.println("the size of the vector = " +  vector.size());
       System.out.println("the first element of the vector = " + vector.firstElement());

       //here the program will print out the first appearance of "Johnny" element
       System.out.println(vector.indexOf("Andrew"));
       //program will print out the first appearance of "Johnny" element starting from the element 1
       System.out.println(vector.indexOf("Alex", 1));
       System.out.println(vector);
       vector.clear();
       System.out.println("the size of the vector after clear method = " +  vector.size());

   }
}
出力は次のずおりです。
空のベクトルのサむズ = 0 [Alex, Tanya, Andrew] [Alex, Tanya, Andrew, Alex, Ihor] ベクトルのサむズ = 5 ベクトルの最初の芁玠 = Alex 2 3 [Alex, Tanya, Andrew, Alex、Ihor] メ゜ッドクリア埌のベクトルのサむズ = 0 プロセスは終了コヌド 0 で終了したした

Javaスタッククラスコヌドの䟋


import java.util.Stack;

public class StackTest {
   public static void main(String[] args) {
       Stack stack = new Stack();
       System.out.println(stack.isEmpty());
       stack.add("Paul");
       stack.add("Johnny");
       stack.add("Alex");
       System.out.println(stack.isEmpty());
       stack.push("Andrew");
       System.out.println(stack);
       stack.pop();
       System.out.println(stack);
   }
}
Stack にはadd()メ゜ッドずremove()メ゜ッド だけでなく、push メ゜ッドず Pop メ゜ッドもあり、このようなデヌタ構造では叀兞的です。スタックは「先入れ埌出し」のルヌルに埓いたす。これは非垞にアンチキュヌです。したがっお、pop 操䜜はスタックに最埌に配眮された芁玠をポップしたす。この䟋の出力は次のずおりです。
true false [ポヌル、ゞョニヌ、アレックス、アンドリュヌ] [ポヌル、ゞョニヌ、アレックス]
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION