1. 程式人生 > >java----day18(集合框架)

java----day18(集合框架)

集合

集合和陣列都是容器,用來儲存多個數據,他們之間的區別是:

  • 陣列長度固定,集合長度可變
  • 集合儲存的資料型別必須是引用型別

Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。

  • 注意:

1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。

5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。HashMap會利用物件的hashCode來快速找到key。

* hashing

雜湊碼就是將物件的資訊經過一些轉變形成一個獨一無二的int值,???,這個值儲存在一個array中。

我們都知道所有儲存結構中,array查詢速度是最快的。所以,可以加速查詢。

發生碰撞時,讓array指向多個values。即,陣列每個位置上又生成一個槤表。

6、Map中元素,可以將key序列、value序列單獨抽取出來。

使用keySet()抽取key序列,將map中的所有keys生成一個Set。

使用values()抽取value序列,將map中的所有values生成一個Collection。

為什麼一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重複。

Iterator迭代器

java提供多個集合,它們在儲存資料時,採用的儲存方式不同,我們要通過一種通用的獲取方式來完成。

Iterator介面提供了很多對集合元素進行迭代的方法。每一個集合類都包括了可以返回迭代器例項的迭代方法。迭代器可以在迭代過程中刪除底層集合的元素,但是不可以直接呼叫集合的remove(Object obj)刪除,可以通過迭代器的remove()方法刪除。

package cn.itcast.demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 *  集合中的迭代器:
 *    獲取集合中元素方式
 *  介面 Iterator : 兩個抽象方法
 *     boolean hasNext() 判斷集合中還有沒有可以被取出的元素,如果有返回true
 *     next() 取出集合中的下一個元素
 *     
 *  Iterator介面,找實現類.
 *    Collection介面定義方法 
 *       Iterator  iterator()
 *    ArrayList 重寫方法 iterator(),返回了Iterator介面的實現類的物件
 *    使用ArrayList集合的物件
 *     Iterator it = array.iterator(),執行結果就是Iterator介面的實現類的物件
 *     it是介面的實現類物件,呼叫方法 hasNext 和 next 集合元素迭代
 */
public class IteratorDemo {
	public static void main(String[] args) {
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		//迭代器,對集合ArrayList中的元素進行取出
		
		//呼叫集合的方法iterator()獲取出,Iterator介面的實現類的物件
		Iterator<String> it = coll.iterator();
		//介面實現類物件,呼叫方法hasNext()判斷集合中是否有元素
		//boolean b = it.hasNext();
		//System.out.println(b);
		//介面的實現類物件,呼叫方法next()取出集合中的元素
		//String s = it.next();
		//System.out.println(s);
		
		//迭代是反覆內容,使用迴圈實現,迴圈的條件,集合中沒元素, hasNext()返回了false
		while(it.hasNext()){
			String s = it.next();
			System.out.println(s);
		}
	}
}
  • 常用方法

  •  集合元素的向下轉型

增強for迴圈

jdk1.5新特性,增強for迴圈

新增超級介面Interable

格式:

for(資料型別  變數名:陣列或集合){}

public class ForEachDemo {
	public static void main(String[] args) {
		function_2();
	}
	/*
	 *  增強for迴圈遍歷集合
	 *  儲存自定義Person型別
	 */
	public static void function_2(){
		ArrayList<Person> array = new ArrayList<Person>();
		array.add(new Person("a",20));
		array.add(new Person("b",10));
		for(Person p : array){
			System.out.println(p);
		}
	}
	
	
	public static void function_1(){
		//for對於物件陣列遍歷的時候,能否呼叫物件的方法呢
		String[] str = {"abc","itcast","cn"};
		for(String s : str){
			System.out.println(s.length());
		}
	}
	public static void function(){
		int[] arr = {3,1,9,0};
		for(int i : arr){
			System.out.println(i+1);
		}
		System.out.println(arr[0]);
	}
}

實現for迴圈,遍歷陣列

  • 好處: 程式碼少了,方便對容器遍歷
  • 弊端: 沒有索引,不能操作容器裡面的元素

泛型

泛型:就是一種不確定的資料型別。

泛型: 指明瞭集合中儲存資料的型別  <資料型別>

比如:ArrayList<E> E就是泛型。 這種不確定的資料型別需要在使用這個類的時候才能夠確定出來。

泛型可以省略,如果省略,預設泛型是Object型別。

  • 泛型的好處:
  1. 省略了強轉的程式碼。
  2. 可以把執行時的問題提前到編譯時期。
  • 帶泛型的類
package cn.itcast.demo3;

import java.util.ArrayList;
import java.util.Iterator;

/*
 *  帶有泛型的類
 *    ArrayList
 *    E: Element 元素, 實際思想就是一個變數而已 
 *    ArrayList<Integer> , E 接受到型別,就是Integer型別
 *    public class ArrayList<E>{
 *    
 *       public boolean add(Integer e){
 *          elementData[size++] = e;
 *       }
 *       
 *       public boolean add(E e){}
 *    }
 *    
 *    Iterator<E> 
 *    E next()
 *    
 *    Iterator<Integer> 
 *    Integer next()
 *   
 */
public class GenericDemo1 {
	public static void main(String[] args) {
		ArrayList<Integer>  array = new ArrayList<Integer> ();
		array.add(123);
		array.add(456);
		// ArrayList集合,自己有個方法
		// <T> T[] toArray(T[] a) 
		Integer[] i = new Integer[array.size()];
		Integer [] j = array.toArray(i);
		for(Integer k : j){
			System.out.println(k);
		}

	}
}
  • 帶泛型的介面
package cn.itcast.demo3;
/*
 *  帶有泛型的介面
 *  
 *  public interface List <E>{
 *    abstract boolean add(E e);
 *  }
 *  實現類,先實現介面,不理會泛型
 *  public class ArrayList<E> implements List<E>{
 *  }
 *  呼叫者 : new ArrayList<String>() 後期建立集合物件的時候,指定資料型別
 *  
 *  實現類,實現介面的同時,也指定了資料型別
 *  public class XXX implements List<String>{
 *  }
 *  new XXX()
 */
public class GenericDemo2 {

}
  • 使用泛型的好處

  • 指定資料型別後,不可以存其他資料型別,否則編譯不通過,保證了安全性
  • 帶來了增強for的使用

泛型萬用字元

/*
	 *  定義方法,可以同時迭代2個集合
	 *  引數: 怎麼實現 , 不能寫ArrayList,也不能寫HashSet
	 *  引數: 或者共同實現的介面
	 *  泛型的通配,匹配所有的資料型別  ?
	 */
	public static void iterator(Collection<?> coll){
		Iterator<?> it = coll.iterator();
		while(it.hasNext()){
			//it.next()獲取的物件,什麼型別
			System.out.println(it.next());
		}
	}

collection<?>就是泛型的通配,僅僅適用於遍歷,不能做強轉

  • 泛型的限定

限定操作的集合型別只能是Employee的子類