1. 程式人生 > >java之集合基礎

java之集合基礎

一、、為何使用類集框架?
java中有物件,物件需要存放,要進行讀取,要傳遞。起先通過陣列,物件陣列來傳遞,但是陣列有很大的弊端不能存放動態的東西,就是說很多物件的多少不是固定不變的。所以用連結串列來存放。但是連結串列開發難度大;效能低下;所以java1.2的時候就開發了類集框架,方便開發者的使用,起初是用所有類集框架都是用object作為返回值,需要使用向下轉型,會帶來安全隱患。1.5提出泛型。故現在類集中都用泛型,有些地方不用會提示警告。

二、藉此機會,再一次瞭解轉型的意義?
    向上轉型: 統一引數; 程式碼更簡潔
    統一引數:是說在呼叫被覆寫的方法時,用到的引數為父類物件,而不再是每個子類的物件。

    轉型首先是建立在繼承和過載/覆寫的基礎上的。

example:  

		example:  
			class Car{
      			run() {
      				System.out.println("父類的run()");
      			}
            }
			class Bmw extends Car{
				run(){寶馬的run}
			}
			class  dazhong extends Car() {
				 run(){大眾的run}
			}
			//這是用向上轉型實現
			main{
				show(Car  car){
					car.run();
				}		
				show(new bmw);//相當於 car  =bmw;
				show(new dahong);	
			}
			//如果不用呢?
			main {
				show(new Bmw);
				show(new dazhong);
			}
			show(dazhong) {
				dazhong.run();
				dazhong1.其他方法
			}
			show(bmw){
				bmw.run();
			}
			//如果有n個子類,那將需要給每個子類寫一個 物件.方法 的方法。程式碼會很不簡潔。
    向下轉型:執行子類的個性化方法。
    向上轉之後,父類只能訪問覆寫過的方法,父類不能訪問到子類中其他的方法,為了解決這個問題。


三、再回顧下集合中的精華。
    一、單物件最大的介面  
    Collection<E> 
            較為重要方法 add()   iterator:例項化它的父類iterator
            它的子介面有倆個。為List,  Set
    List子介面 :物件可以重複。
        1.子類:ArrayList  陣列實現,查詢快,插入,刪除慢
            擴充的方法  get(index);  set(index, element);  listIterator();
            擴充的方法主要是方便讀取寫入單個的元素。次要的是為了實現了迭代的子介面。lsitIterator()是Iterator的子介面。那麼就可以在list物件中直接建立迭代器了,用hasNext()來判斷

        2.LinkedList子類: 用連結串列實現,查詢慢,插入,刪除快 。雙向連結串列。
        3.Vector子類:出現比較早,採用執行緒同步,比較安全。用的不多。也是陣列實現。

    Set子介面:元素不能重複
    並沒有對父介面進行擴充,簡單的繼承。當然也無法使用get()之類
    常用的子類:HashSet,TreeSet
        HashSet子類:雜湊存放
        Hash演算法:用二進位制計算結果來設定儲存位置,當然無序,但是查詢比較快。

    TreeSet子類:進行排序
    要和比較器 compareTo結合使用。用法就是,實體類需要繼承compareTo,
    這裡關於 重複元素的消除,和比較規則,我還會再操作中寫到具體程式碼操作。

    二、雙物件的介面Map
        HashMap子類

            資料格式為:key-value。類的型別解僱為 <map,entry>

            特別的是,這倆部分都是一個集合,可以分別取得。得轉換為iterator物件才能分別以list輸出。

            它們允許同時為null
            常用方法:Put(key,value);  如果key值重複,值會替代
            get(key)
            Set<> entrySet():將map轉換為set集合,主要用來迭代Map,很必須
            Set< > keySet(): 取出全部的key
            Hashtable子類   用的不多。採用執行緒同步,不允許key-value為null


集合的特點說完了
四、下來是集合的輸入操作:
        單物件的輸出
        有4中操作: Iterator.class  ListIterator,  foreach.  Enumeration. 我只用過for?  enum連見都沒見過。。
    1。Iterator
              Collection可是繼承了Iterator介面的,我去,介面中就一個方法Iterator(),
                這個方法最火!用法:集合名.hasNext()?next():null;
    2。ListIterator
        一看就是人家的子介面
        它可以向前迭代。提供了hasPrevious().和previous() 意思是 : 有沒有?取出來

   3. for簡單
        for(String string :listname) {
            System.out.println(string);
        }

    4. Enumeration列舉輸出。太不重要了,不管了。

雙物件集合的輸出:也是迭代輸出

public class IteratorMap {

	public IteratorMap() {
		// TODO Auto-generated constructor stub
	}	
	public static void main(String[] args) {
		Map <String ,Integer>map=new Hashtable<String ,Integer>();
		map.put("書",20);
		map.put("電腦",100);
		map.put("床",24);
		//Map的類結構為<Map,Entry>
		//map轉換為同類型的set
		Set<Map.Entry<String, Integer>> set=map.entrySet();
		//set轉圜為iterator介面例項
		Iterator<Map.Entry<String, Integer>> iterator=set.iterator();
		//取得迭代內容
		while(iterator.hasNext()) {
			Map.Entry<String, Integer>  mEntry=iterator.next();
			System.out.println(mEntry.getKey()+mEntry.getValue());
		}
	}
}
集合面試分析:
1.陣列Array和集合ArrayList區別? 長度固定不固定問題;
2. Collection是用來輸出的,而map是用來查詢的?
hashMap集合採用了hash演算法,查詢速度快。我還要了解下hash實現,還不會。