JAva集合フレームワーク詳細(三)、Listインタフェース

7490 ワード

3.1.2 Listインタフェース
Listは秩序化されたCollectionであり、このインタフェースを使用して各要素が挿入される位置を正確に制御することができる.ユーザは、Javaの配列に類似したリスト内の要素にアクセスするためにインデックス(リスト内の要素の位置、配列の下付きと同様)を使用することができる.リストは、順序付けられた集合であり、集合内の各要素には対応する順序のシーケンスがある.リスト集合は、重複要素を使用することができ、インデックスを介して指定された位置の集合要素にアクセスすることができる(シーケンスインデックスは0から)、リストセットはデフォルトで要素の追加順に要素のインデックスを設定します.例えば、最初の要素のインデックスは0で、配列のようです.
ListはCollectionサブインタフェースとして当然そのすべての方法を有し、同時に独自の方法もある.
void add(int index,Object):リストセットのindexに要素eを追加します.
boolean addAll(int index,Collection c):集合cに含まれるすべての要素をList集合のindexに挿入する.
Object get(int index):集合indexインデックスの要素を返します.
int indexOf(Object o):リストセットにおいてオブジェクトoが最初に出現した位置のインデックスを返す.
int lastIndexOf(object o):リストセットに最後にオブジェクトoが出現した位置インデックスを返す.
Object remove(int index):indexインデックスの要素を削除して返します.
Object set(int index,Object e):集合indexの要素をeオブジェクトに置き換え、以前指定した位置にあった要素を返します.
List subList(int fromIndex,int toIndex):すべてのfromIndex(含む)からtoIndex(含まない)までのすべての集合要素のサブ集合を返します.
以下のコードを参照して、リストインタフェースの一部の方法を説明し、Collectionインタフェースのブロックを参照する方法の例プログラムを説明します.
 
import java.util.ArrayList;
import java.util.List;

public class ListFangFa {
	public static void main(String[] args) {

		/*
		 *1、 boolean add(E e)              (    )。 
		 *2、void add(int index, E element)               (    )。
		 *3、 boolean addAll(Collection<? extends E> c)     collection              ,                    *    collection              (    )。
		 *4、 boolean addAll(int index, Collection<? extends E> c)     collection                             *        (    )。
		 */

		List l = new ArrayList();

		l.add("A");//   0
		l.add("B");// 1
		l.add("C");//
		l.add("B");// 
		l.add(0, "D");// D     0 

		System.out.println(l);//[D, A, B, C, B]

		/*
		 *5、 Object get(int index)             。
		 */
		Object o = l.get(0);
		System.out.println(o);//D
		/**
		 *6、 int indexOf(Object o)                    ;           ,    -1。
		 *7、 int lastIndexOf(Object o)                   ;          ,    -1。
		 */
		System.out.println(l.indexOf("B"));//    B   2      //2
		System.out.println(l.lastIndexOf("B"));//    B   4       //4

		/*
		 *8、 Object remove(int index)             (    )。 ,       
		 *9、 boolean remove(Object o)                  (    )(    )。
		 *10、 boolean removeAll(Collection<?> c)          collection          (    )。
		 */

		System.out.println("----  ------");
		o=l.remove(0);//    0   D
		System.out.println(o);//D
		System.out.println(l);//[A, B, C, B]
		/**
	        * Object set(int index, Object element)                 (    )。         
		*/

		System.out.println(l.set(0, "  "));//      "  "         0    A
		System.out.println(l);//[  , B, C, B]
		/*
		 * List<E> subList(int fromIndex, int toIndex)          fromIndex(   ) toIndex(                    * )       。
		 */

		System.out.println(l.subList(1, 3));//     1、2   , B,C  //[B, C]

		l.clear();
                //9、 boolean remove(Object o)                  (    )(    )。
		l.add("A");
		l.add("B");
		l.add("C");
		l.add("B");
		System.out.println(l);//[A, B, C, B]

		l.remove("B");//                  
		System.out.println(l);//[A, C, B]
	   }	
	}

 
前述したSetとは異なり、Listは同じ要素を許可する.リストは、Collectionインタフェースに必要なiterator()メソッドに加えてlistIterator()メソッドを提供し、ListIteratorインタフェースオブジェクトを返します.ListIteratorインタフェースは、ListIteratorインタフェースを継承します.(リストセットの出力を操作するためのサブインタフェース)は、リストを操作するための方法を提供する.標準的なIteratorインタフェースと比較して、リストIteratorにはadd()などの方法が多く、追加、削除、設定要素を許可し、前後に遍歴することができ、すなわち双方向出力をサポートする.次の表はListIteratorインタフェースの方法です
メソッドの概要
void
add(E e)指定した要素をリストに挿入します(オプション).
boolean
hasNext()が順方向にリストを巡回する場合、リスト反復器に複数の要素がある場合はtrueを返します(換言すれば、nextが例外ではなく1つの要素を返す場合はtrueを返します).
boolean
hasPrevious()リストを逆方向にループし、リスト反復器に複数の要素がある場合はtrueを返します.
E
next()は、リスト内の次の要素を返します.
int
nextIndex()は、nextの後続呼び出しに対して返される要素のインデックスを返します.
E
previous()は、リストの前の要素を返します.
int
previousIndex()は、previousの後続呼び出しに対して返される要素のインデックスを返します.
void
remove()nextまたはpreviousによって返される最後の要素をリストから削除します(オプション).
void
set(E e)nextまたはpreviousが返す最後の要素を指定した要素で置き換えます(オプション).
 
boolean hasPrevious():反復器関連セットに前の要素があるかどうかを返します.
Object previous():反復器の前の要素を返します.
次のコードはlistIterator()メソッドを説明します.
  
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;


public class ListDelistIteratorDemo {
	public static void main(String[] args) {
		
	List l = new ArrayList();	
	
	l.add("A");
	l.add("B");
	l.add("C");
	l.add("D");
	
	System.out.println(l);
	
	for(Iterator it = l.iterator(); it.hasNext();){
		System.out.println("--> "+it.next());
	}
	
	/**
	 *  ListIterator<E> listIterator()               (     )。 
	 */
	
	ListIterator lit = l.listIterator();
	
	System.out.println(lit.hasPrevious());//false,         
	//System.out.println(lit.previous());//         
	//E next()            
	Object o = lit.next();//        
	System.out.println("----->"+o);
	System.out.println("         = " + lit.previousIndex());
	System.out.println("           = " + lit.previous());
	
	/**
	 *     
	 */
	System.out.println("----------------------");
	while(lit.hasNext()){
		System.out.println(lit.next());
	}
	
	/**
	 *     
	 */
	while(lit.hasPrevious()){
		System.out.println("-xian->" +lit.previous());
	}
  }
}

 
Listインタフェースを実装する一般的なクラスはLinkedList,ArrayList,Vector,Stack(主に上位2つ)である.
LinkedList:
LinkedListは、Javaで開発者にチェーンテーブルプログラムが提供されているチェーンテーブルの操作クラスを表し、開発者が直接使用すればよいので、再開発する必要はなく、このクラスで定義されたチェーンテーブルもスタックやキューのように使用することができる.JDK APIから見られるLinkedListクラスの定義は以下の通りである.
  public class LinkedList
  extends AbstractSequentialList
  implements List, Deque, Cloneable, Serializable
このような実装リストとQueue(キュー)インタフェースとDeque(双方向キュー)インタフェースが表示されます.一方、LinkedListクラスは、Listインタフェースの実装に加えて、リストの先頭および末尾get、remove、およびinsert要素に統一されたネーミング方法を提供する.これらの操作により、リンクリストをスタック、キュー、または両端キューとして使用できます.このようなDequeインタフェースは、add、pollに先進的な先頭キュー操作、および他のスタックおよび両端キュー操作を提供します.一言:LinkedList:クラスはチェーンテーブルを実現し、このクラスによって定義されたチェーンテーブルはスタックやキューのように使用することもできる.
ArrayList:
ArrayListの定義は以下の通りです.
  public class ArrayList
  extends AbstractList
  implements List, RandomAccess, Cloneable, Serializable
このようにListインタフェースが実装されていることが分かるので、ArrayListを直接使用してListインタフェースをインスタンス化することができる.ArrayLisクラスはListインタフェースのサイズ可変配列の実装である.すべてのオプションリスト操作が実現され、nullを含むすべての要素が許可されます.リストインタフェースの実装に加えて、リストを格納するために内部で使用される配列のサイズを操作する方法も提供される.(このクラスはほぼVectorクラスと同等であり、これ以外は同期していない.)つまり、ArrayList:規模が可変でチェーンテーブルのようにアクセスできる配列を実現する.
 
簡単に言えば、いくつかの点を説明します.
1、ArrayList:スレッドが安全ではなく、検索速度が速い.
2、LinkedList:チェーンテーブル構造、削除速度が速い.リストセットの要素を取り出す方法:
get(int index):足標から要素を取得します.
iterator():反復法により反復オブジェクトを取得します.
注意:チェーンテーブル(Linked list)は一般的な基礎データ構造であり、線形テーブルであるが、線形の順序でデータを格納するのではなく、各ノードに次のノードに格納するポインタ(Pointer)である.順番に保存する必要がないため、挿入と削除が高速です.ArrayListとVectorクラスはいずれも配列に基づいて実現されるListクラスであり,Vectorは比較的古く,ArrayListに取って代わられている.ArrayListはスレッドが安全ではなく、Vectorはスレッドが安全であるが、それでもVectorの使用は推奨されない.Collectionsはスレッドが安全なArrayListオブジェクトを得る方法があるからである.Collectionsクラス:static List synchronizedList(List list)は、指定したリストでサポートされている同期(スレッドが安全な)リストを返します.
3、Vector:スレッドは安全だが、速度が遅く、ArrayListに取って代わられ、解をしない.
 
 
未完待機・・・