1. 程式人生 > >黑馬程式設計師-----泛型,Map集合

黑馬程式設計師-----泛型,Map集合

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

1.泛型初步

泛型:JDK1.5版本以後出現新特性。用於解決安全問題,是一個型別安全機制
好處
(1)將執行時期出現問題ClassCastException,轉移到了編譯時期。  方便於程式設計師解決問題。讓執行時問題減少,安全。
(2)避免了強制轉換麻煩。

什麼時候定義泛型類?
當類中要操作的引用資料型別不確定的時候,早期定義Object來完成擴充套件。現在定義泛型來完成擴充套件。

<span style="font-size:14px;">class GenericDemo 
{
	public static void main(String[] args) 
	{

		ArrayList<String> al = new ArrayList<String>();

		al.add("abc01");
		al.add("abc0991");
		al.add("abc014");
		
  	Iterator<String> it = al.iterator();//迭代器也得定義泛型
		while(it.hasNext())
		{
			String s = it.next();//不用強轉了
			System.out.println(s+":"+s.length());
		}
	}
}</span>

2.泛型方法

泛型類定義的泛型,在整個類中有效。如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所有要操作的型別就已經固定了。為了讓不同方法可以操作不同型別,而且型別還不確定。那麼可以將泛型定義在方法上。
特殊之處:
靜態方法不可以訪問類上定義的泛型。如果靜態方法操作的應用資料型別不確定,可以將泛型定義在方法上

class Demo<T>//建立物件後才能明確這個T
{
	public  void show(T t) //泛型方法
	{
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q)//跟類的型別不一樣的方法
	{
		System.out.println("print:"+q);
	}
	public  static <W> void method(W t)//不寫泛型不行
	//<W>寫在返回值型別前面,這是格式
	{
		System.out.println("method:"+t);
	}
}
class GenericDemo4 
{
	public static void main(String[] args) 
	{
		Demo <String> d = new Demo<String>();
		d.show("haha");
		//d.show(4); 這個就不行了
		d.print(5); //這個是能列印的不受類的影響
		d.print("hehe");

		Demo.method("hahahahha");//可以執行
	}
}

3.map概述

基本方法
  新增。
        put(K key, V value) 
        putAll(Map<? extends K,? extends V> m) 
    刪除。
        clear() 
        remove(Object key) 
    判斷。
        containsValue(Object value) 
        containsKey(Object key) 
        isEmpty() 
  獲取。
        get(Object key) 
        size() 
        values() 
set        entrySet()
set        keySet() 

        
    |--Hashtable:底層是雜湊表資料結構,不可以存入null鍵null值。該集合是執行緒同步的。jdk1.0.效率低。
    |--HashMap:底層是雜湊表資料結構,允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。
    |--TreeMap:底層是二叉樹資料結構。執行緒不同步。可以用於給map集合中的鍵進行排序。

4.map的取出方式

(1)Set<k>   keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
(2)Set<Map.Entry<k,v>>  entrySet:將map集合中的對映關係存入到了set集合中,而這個關係的資料型別就是:Map.EntryEntry其實就是Map中的一個static內部介面。
        

為什麼要定義在內部呢?
因為只有有了Map集合,有了鍵值對,才會有鍵值的對映關係。關係屬於Map集合中的一個內部事物。而且該事物在直接訪問Map集合中的元素。

class MapDemo
{
	public static void main(String[] args) 
	{
		Map<String,String> map = new HashMap<String,String>();
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");
		map.put("01","zhangsan1");
		map.put("04","zhangsan4");

		//將Map集合中的對映關係取出。存入到Set集合中。
		Set<Map.Entry<String,String>> entrySet = map.entrySet();
		
		//用迭代器取Set集合中的對映關係
		Iterator<Map.Entry<String,String>> it = entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry<String,String> me = it.next();
			String key = me.getKey(); //取到鍵
			String value = me.getValue(); //取到值

			System.out.println(key+":"+value);

		}

		//下面這是另外一種方法先把所有的鍵放入Set集合
		/*
		//先獲取map集合的所有 鍵 的Set集合,keySet();
		Set<String> keySet = map.keySet();

		//有了Set集合。就可以獲取其迭代器。
		Iterator<String> it = keySet.iterator();

		while(it.hasNext())
		{
			String key = it.next();
			//有了鍵可以通過map集合的get方法獲取其對應的值。
			String value  = map.get(key);
			System.out.println("key:"+key+",value:"+value);
		}
		*/

	}
}

5.map知識的擴充套件

用map集合裝下下面的內容。
"yureban"   Student("01" "zhangsan");
"yureban"   Student("02" "lisi");
"jiuyeban"   "01" "wangwu";
"jiuyeban"   "02" "zhaoliu";
一個學校有多個教室。每一個教室都有名稱。每個教室還都有學生物件

通過這個示例,要能夠對map集合元素的取出更加熟練

import java.util.*;
//這是個學生類
class Student
{
	private String id;
	private String name;
	//一初始化就有id和name
	Student(String id,String name)
	{
		this.id = id;
		this.name = name;
	}
	//覆蓋toString有自己的列印方法
	public String toString()
	{
		return id+":::"+name;
	}
}
class  MapDemo
{

	public static void demo()
	{
		//建立一個對映,存入教室名,和教室裡學生的List集合
		HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>();
		//分別建立兩個教室集合存放學生
		List<Student> reyu = new ArrayList<Student>();
		List<Student> jiuye = new ArrayList<Student>();

		czbk.put("yureban",reyu);
		czbk.put("jiuyeban",jiuye);

		reyu.add(new Student("01","zhagnsa"));
		reyu.add(new Student("04","wangwu"));
		jiuye.add(new Student("01","zhouqi"));
		jiuye.add(new Student("02","zhaoli"));
     
		//進行迭代,先將教室迭代出來
		Iterator<String> it = czbk.keySet().iterator();

		while(it.hasNext())
		{
			String roomName = it.next(); //這是key即教室名
			//得到教室集合
			List<Student> room = czbk.get(roomName);
			System.out.println(roomName);
			//呼叫方法迭代出學生
			getInfos(room);
		}
	}
	public static void getInfos(List<Student> list)
	{
		//迭代出每個學生物件
		Iterator<Student> it = list.iterator();
		while(it.hasNext())
		{
			Student s = it.next();
			System.out.println(s);
		}
	}
}