List集合及び集合汎型

13455 ワード

リスト集合
List集合のサブ実装クラスの特徴:ArayList:下地データ構造は配列の形態であり、配列構造の特徴を満足する:検索が速く、削除が遅く、スレッドの安全問題から見て:スレッドが安全ではない、同期ではない、実行効率が高い、ArayListはList集合のサブリアルクラスであるため、その要素は重複し、記憶と取り出しが一致する.
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo {
	
	public static void main(String[] args) {
		
		//    ArrayList    
		ArrayList array = new ArrayList() ;
		
		//    
		array.add("hello") ;
		array.add("hello") ;
		array.add("world") ;
		array.add("world") ;
		array.add("java") ;
		array.add("java") ;
		
		//    :
		//1)       
		Iterator it = array.iterator() ;
		while(it.hasNext()){
			String s = (String)it.next() ;
			System.out.println(s);
		}
	}
}
カスタムオブジェクトを巡回
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo2 {
	
	public static void main(String[] args) {
		
		//  ArrayList    
		ArrayList array = new ArrayList() ;
		
		//        
		Student s1 = new Student("   ", 27) ;
		Student s2 = new Student("  ", 25) ;
		Student s3 = new Student("  ", 29) ;
		Student s4 = new Student("   ", 28) ;
		
		//       
		array.add(s1) ;
		array.add(s2) ;
		array.add(s3) ;
		array.add(s4) ;
		
		
		
		//        
		Iterator it = array.iterator() ;
		while(it.hasNext()){
	//java.lang.ClassCastException: org.westos_01.Student cannot be cast to java.lang.String
//			String s = (String)it.next() ;          
			Student s = (Student) it.next() ;
			System.out.println(s);
		}
	}
}
練習:
需要:ArayListは、集合中の文字列の重複要素を除去する.
二つの方法:
  1)新しいセットを作成し、重複していない文字列を保存し、巡回します.
 
  2)選択された順序付けの論理から思い付きます.
       0索引に対応する要素を順に、後の索引に対応する要素と比較します.
       同じように、1インデックスに対応する要素と、後に….
       前の索引に対応する要素が後の索引に対応する要素と重複したら、集合から後の索引の対応する要素を取り外す.
import java.util.ArrayList;

public class ArrayListTest2 {

	public static void main(String[] args) {
		
		//       ,      
		ArrayList array = new  ArrayList();
		

		array.add("hello");
		array.add("hello");
		array.add("Javaweb");
		array.add("world");
		array.add("world");
		array.add("Java");
		array.add("Java");
		array.add("hello");
		array.add("Javaweb");
		array.add("JavaEE");
		array.add("JavaEE");

		ArrayList newArray = new ArrayList();
		
		for(String s1:array) {
			//                ,         
			if(!newArray.contains(s1)) {
				newArray.add(s1);
			}
		}
		//     
		for(String s2 : newArray) {
			System.out.println(s2);
		}
		
		//System.out.println(array);
		for (int x = 0; x < array.size() - 1; x++) {
			for (int y = x + 1; y < array.size(); y++) {
				//      
				if (array.get(x).equals(array.get(y))) {
					array.remove(y);
					y--;
				}
			}
		}		
 //  for  
		for(String s3:array) {
			System.out.println(s3);
		}
	}
}
需要:ArayListは、セット内のカスタムオブジェクトの重複値を除去する(オブジェクトのメンバー変数値は同じ).
import java.util.ArrayList;

/**
 *   :ArrayList              (           )
 * 
 * */
public class ArrayListTest3 {

	public static void main(String[] args) {
		//    
		ArrayList array = new ArrayList();
		
		//      
		Student s1 = new Student("  ", 23); 
		Student s2 = new Student("  ", 25);
		Student s3 = new Student("  ", 23);
		Student s4 = new Student("   ", 25);
		Student s5 = new Student("  ", 28);
		Student s6 = new Student("  ", 28);
		Student s7 = new Student("   ", 25);
		Student s8 = new Student("   ", 21);
		//       
		array.add(s1);
		array.add(s2);
		array.add(s3);
		array.add(s4);
		array.add(s5);
		array.add(s6);
		array.add(s7);
		array.add(s8);
		//       
		ArrayList newArray = new ArrayList();
		for(Student st1 : array) {
			////              
			if(!newArray.contains(st1)) {
				newArray.add(st1);
			}
		}
		//     
		for(Student st2 :newArray) {
			System.out.println(st2);
		}
		
/**
 *           ,    ?
 * contains()       equals()  ,equals()   Object      ,                  ,     Object  eqauls()
 *    ,          ;
 *  		           Object  equasl()  ,              
 *     :
 *  
 *  		ArrayList   Contains()  
 *  		  public boolean contains(Object o) {
 *      		return indexOf(o) >= 0;
 *  }
 *
 *
 *   public int indexOf(Object o) {
 *      if (o == null) {
 *           for (int i = 0; i < size; i++)
 *               if (elementData[i]==null)
 *                   return i;
 *       } else {
 *           for (int i = 0; i < size; i++)
 *               if (o.equals(elementData[i]))
 *                   return i;
 *       }
 *       return -1;
 *   }
 *    equasl()   ,        
 */

		
	}
}
練習:セットの入れ子が巡回します.
public class ArrayListTest {

	public static void main(String[] args) {
		//      
		ArrayList> bigArray = new ArrayList>();
		//         
		ArrayList firstArray = new ArrayList();
		//      
		Student s1 = new Student("   ", 18);
		Student s2 = new Student("  ", 23);
		Student s3 = new Student("   ", 27);
		Student s4 = new Student("    ", 25);
		
		firstArray.add(s1);
		firstArray.add(s2);
		firstArray.add(s3);
		firstArray.add(s4);
		//               
		bigArray.add(firstArray);
		//         
		ArrayList secondArray = new ArrayList();
		Student s5 = new Student("   ", 18);
		Student s6 = new Student("dreamer_96", 21);
		Student s7 = new Student("   ", 27);
		secondArray.add(s5);
		secondArray.add(s6);
		secondArray.add(s7);
		bigArray.add(secondArray);
		//  for  
		for(ArrayList array:bigArray) {
			for(Student s:array) {
				
				System.out.println(s.getName()+"----"+s.getAge());
			}
		}
		
	}
}
Vector:
下のデータ構造は配列の形式で、検索が速く、削除が遅いです.
スレッドの角度から見て、スレッドの安全なクラス、同期、実行効率が低いです.
特有の機能:public void addElement(E Object e)相当于:add(Object e)public Emperation element()-->相当于:Iterator iterator();Enumerationインターフェース:ベクトルのコンポーネント列挙には二つの方法があります.boot has MoreElements():-------------->相当于:has Next()Object nextElement():------->相当于:next().
public class VectorDemo {
	
	public static void main(String[] args) {
		
		//    Vector    
		Vector v = new Vector() ;
		
		//    
		//public void addElement(E obj)
		v.addElement("hello");
		v.addElement("hello");
		v.addElement("world");
		v.addElement("Java");
		
		//public Enumeration elements()----->   :Iterator iterator() ;
		Enumeration en = v.elements() ;
		//    
		/**
		 * boolean hasMoreElements():------>   :hasNext()
		Object nextElement():----------->   :next();
		 */
		while(en.hasMoreElements()){
			//    
			String s = (String)en.nextElement() ;
			System.out.println(s);
		}
	}
}	
Linked List:
下のデータ構造はリンクリストで、特徴:検索が遅く、添削が速いです.
スレッドの角度から見て、スレッドが安全ではないクラスで、同期しないで、実行効率が高いです.
マルチスレッドプログラムが実現されれば、通常は安全なクラス:
StringBuffer、Vector、hashtable
synchronized(同期ロック対象){
コード;
)
特有の機能:機能を追加します.public void addFirst(E e)は指定の要素をこのリストの先頭に挿入します.public void addLast(E e)は、このリストの最後に指定要素を追加します.取得機能:public Object get First()は、このリストの最初の要素public Object getLast()を返します.削除機能:public Object removeFirst()は削除され、このリストの最初の要素に戻ります.public Object removeLast()はこのリストの最後の要素を削除して返します.
一般的な需要の中でセットを指定していない場合は、デフォルトではArayListを採用しています.必要に応じてスレッドの安全を考慮するなら、Vectorを使用して集合します.  筆記試験の過程で、いくつかの需要は集合を使います.
public class LinkedListDemo {
	
	public static void main(String[] args) {
		
		//  LinkedList  
		LinkedList link = new LinkedList() ;
		
		//    
		link.addFirst("hello") ;
		link.addFirst("world") ;
		link.addFirst("Java") ;
		
		//public void addFirst(E e)             
		/*link.addFirst("android") ;
		link.addLast("JavaWeb") ;*/
		
		
		/**
		 * public Object getFirst()           
			public Object getLast()            。
		 */
		/*
		Object obj = link.getFirst() ;
		System.out.println(obj);
		Object obj2 = link.getLast() ;
		System.out.println(obj2);*/
		
		/**
		 * public Object removeFirst()              。
			public Object removeLast()               。
		 */
		/*System.out.println("removeFirst:"+link.removeFirst());
		System.out.println("removeLast:"+link.removeLast());*/
		
		//    
		System.out.println("link:"+link);
	}
}
 
   
  

关于数据结构

自定义栈集合类,然后使用LinkedList的一些特有功能模拟栈结构特点

public class LinkedListDemo {
	
	public static void main(String[] args) {
		
		
		//  LinkedList     
		LinkedList link = new LinkedList() ;
		//LinkedList       :addFirst(Object e) 
		//      :    
		link.addFirst("hello") ;
		link.addFirst("world") ;
		link.addFirst("java") ;
		
		Iterator it = link.iterator() ;
		while(it.hasNext()){
			String s = (String)it.next() ;
			System.out.println(s);
		}
	}
}
JDK 5.0以降の新しい特性:
泛型、強化for循環、可変パラメータ、静的導入、自動的に箱詰め、列挙など
一.汎型
パン種の引き出し:
ArayListメモリを使用すると
 
ArayListセットには、Stringタイプの要素、Integerタイプの要素がいくつか記憶されています.
  しかし、ローズマリーを通して要素を遍歴しています.システムはセットにどのような要素が記憶されているか分かりません.すべての種類のStringを使って受信すると、Class CastExceptionが現れます.クラス変換は異常です.
  このようなデザインはあまり良くないです.
  
配列を定義します.文字列配列
String[]str=new String[3];
str[0]=「ハロー」
str[1]=「world」
文字列タイプでない場合:
         
str[2]=100;//エラーを申し込む
  
  配列設計のこのような利点:事前に開発者に教えました.ここではStringタイプの要素しか入れられません.Javaは配列の特徴によって-->引き出します.
 汎型:データタイプの明確な作業を作成対象または呼び出し方法の時期に予め定められた特殊なタイプに提供します.パラメータ化タイプは、パラメータのように伝えられます.
 
書式:
 
:汎型は、参照タイプだけを置くことができます.
  
汎型のメリット:
  
1)運転時期の異常をコンパイル時期に繰り上げました.
  
2)黄色い警告線の問題を解決しました.
 
3)データを取得する場合は、強制的に変換しなくても大丈夫です.
クラスに汎型を入れました.実際のテストでは、データの種類を与えられました.データを取得するときは、タイプで受信しなければなりません.
public class GenericDome {

	public static void main(String[] args) {
		//  ArrayList  
		ArrayList array = new ArrayList();
		Student s1 = new Student("  ",24);
		Student s2 = new Student("  ",21);
		Student s3 = new Student("   ",28);
		Student s4 = new Student("  ",25);
		//       
		array.add(s1);
		array.add(s2);
		array.add(s3);
		array.add(s4);
		Iterator it = array.iterator();
		
		//     
		while(it.hasNext()) {
			Student s = it.next();
			System.out.println(s.getName()+"------"+s.getAge());
		}
	}
}
汎型定義は方法上:
public class ObjectTool{
	
	//         
	public  void show(T t){
		System.out.println(t);
	}
}
汎型はプログラムの安全性を提供できます.
   初期の時は、Objectタイプで任意のタイプを表します.
   上への転換は問題ないですが、下への転換は、型転換が隠れているため、エラーが発生します.
public class ObjectToolDemo {
	
	public static void main(String[] args) {
		
		//  ObjectTool  
		ObjectTool ot = new ObjectTool() ;
		//    
		ot.setObj(27) ;//Object obj = new Integer(27):    
		//  
		Integer i = (Integer) ot.getObj() ;//    
		System.out.println("   :"+i);
		
		
		ObjectTool ot2 = new ObjectTool() ;
		//  
		ot2.setObj("   ") ;//Object obj = new String("   ") ;
		//  
		String str = (String) ot2.getObj() ;//     :    :       
		System.out.println("   :"+str);
		
		System.out.println("-------------------------------");
		
		ObjectTool ot3 = new ObjectTool() ;
		ot3.setObj("  ") ;
		//java.lang.ClassCastException
		Integer ii = (Integer) ot3.getObj() ;//              :     
		System.out.println("   :"+ii);
	}
}	
二.拡張forサイクル:
書き方:
  
for(集合または配列中のデータタイプ変数名:集合または配列のオブジェクト名){
  
変数名を出力します
  
)
  
  forサイクルを強化する弊害:
配列または集合を巡回した場合、配列オブジェクトまたは集合オブジェクトはnullではいけません.
  
対象が空であれば、通常は空でない判断を加えます.
  
  拡張forサイクルの出現は、ローズマリーの代わりに集合を巡回するためであり、今後の開発では、拡張forを使用して要素を巡回します.
public class ForDome {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		//      ,     
		int []  arr = {12,13,34,5,22};
		//  for    
		for(int x = 0;x < arr.length;x++) {
			System.out.print(arr[x]+" ");//12 13 34 5 22 
		}
		System.out.println();
		//  for  
		for(int i:arr) {
			System.out.print(i+" ");//12 13 34 5 22
		}
		System.out.println();
		//   
		String [] strArray = {"     ","     "};
		//  for  
		for(String s:strArray) {
			System.out.print(s+" ");//            
		}
		System.out.println();
		//   ArrayList    ,       
		ArrayList array = new ArrayList();
		//     
		array.add("hello");
		array.add("world");
		array.add("java");
		//     
		Iterator it = array.iterator();
		while(it.hasNext()) {
			System.out.print(it.next()+" ");// hello world java 
		}
		//  for  
		/*for(String s:array) {
			System.out.print(s+" ");//hello world java 
			
			if("world".equals(s)) {//java.util.ConcurrentModificationException
				array.add("Javaweb");
			}
		}*/
		array = null;
		if(array != null) {//    
			for(String s:array) {
			
				System.out.print(s+" "); //java.lang.NullPointerException        for  
			}
		}
		
	}
}