黑馬程序員_【總結】_集合框架知識梳理2

集合框架知識梳理2


---------- android培訓 java培訓、期待與您交流! ---------- 

---------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------
1、MAP 雙列 集合 、Collection 單列集合
|--Hsahtable :底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的 JDK1.0 效率低
|--HashMap   :底層是哈希表數據結構,允許存入null鍵null值,該集合是不同步的     JDK1.2 效率高
|--TreeMap   :底層是二叉樹數據結構,線程不同步,可以給Map集合中的鍵進行排序
2、需要注意的是 MAP是沒有 迭代器的,想要迭代,必須通過創建一個Collection對象接收values的值再迭代
3、MAP 集合 存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。    鍵  是 不可重複的。
4、HashMap   作爲升級版  可以把 null作爲鍵或者值
5、map集合的兩種取出方: entrySet()【重點】keySet()  【重點】
6、keySet(): 將map 中的所有鍵存入到set集合,因爲set集合具備迭代器
用迭代器取出所有鍵,通過get方法,取出鍵對應的 值
7、entrySet(): 在set集合中存儲的是映射關係。
該映射關係是以Map.Entry接口的對象形式存在的,所以set的泛型就是該接口
調用 set集合的迭代器 ,將一個個Map.Entry 對象取出
然後調用該對象自帶方法,取出 鍵和值 
8、Entry :其實也是一個接口,MAP的子接口,可以用類實現接口,用類的內部類子接口
9、HashMap 不能進行比較排序不論是 implements Comparator 還是 implements Comparable 
10、Map 集合被使用是因爲具備映射關係。 
-------------------------------------------------------
Map   集合    【   Map(K,V)    】   

該集合存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。
(看API的時候,可以先羅列出這個集合可能擁有的功能,然後對應去看)

Map
|--Hsahtable :底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的 JDK1.0 效率低
|--HashMap   :底層是哈希表數據結構,允許存入null鍵null值,該集合是不同步的     JDK1.2 效率高
|--TreeMap   :底層是二叉樹數據結構,線程不同步,可以給Map集合中的鍵進行排序

Map 和Set很像
其實,Set底層就是使用了Map集合。
(Collection 單列集合,Map 雙列集合)

Map 集合和 基本方法
class  MapDemo1{
	public static void main(String[] args) {
		Map<String,String>  mss = new HashMap<String,String>();
		mss.put("01","huan1");
		mss.put("01","huan99");//當存入相同鍵的時候,新的值會覆蓋原有值
		mss.put("02","huan2");
		mss.put("03","huan3");
		System.out.println("打印出集合:"+mss);
		System.out.println("有huan值嗎?"+mss.containsValue("huan"));
		System.out.println("有03編號嗎?"+mss.containsKey("03"));
		System.out.println("刪除03編號"+mss.remove("03"));
		System.out.println("打印出集合:"+mss);
		System.out.println("有03編號嗎?"+mss.containsKey("03"));
		System.out.println("集合爲空嗎"+mss.isEmpty());
		//System.out.println(mss.clear());
		System.out.println("集合爲空嗎"+mss.isEmpty());
		System.out.println("獲取值"+mss.get("01"));
		System.out.println("獲取值"+mss.get("011"));//其實可以使用get方法判斷某一個建存不存在
		System.out.println("獲取長度"+mss.size());		
		mss.put(null,"我是空鍵的值");
		mss.put("05",null);
		System.out.println("------------------------------------------------\n"+
							"要注意,HashMap是可以將null作爲鍵,或者值的");
		System.out.println("獲取值空鍵::"+mss.get(null)+"\n\tnull鍵並不多見,可以使用get進行判斷,查看是否存在null的鍵");
		System.out.println("\n------------------------------------------------");
		Collection<String> coll=mss.values();
		//由於MAP沒有迭代器,所以:通過創建一個Collection對象接收values的值再輸出
		System.out.print("迭代器輸出:");
		for(Iterator<String> it=coll.iterator();it.hasNext(); ){
			System.out.print(it.next()+" ");
		}
		System.out.println("\n打印出集合:"+mss);
		System.out.println(mss.put("09","-0-"));
		System.out.println(mss.put("09","9999999"));//當存入相同鍵的時候,新的值會覆蓋原有值
	}
}
例子中,羅列出 各種基本方法。
1、需要注意的是 MAP是沒有 迭代器的,想要迭代,必須通過創建一個Collection對象接收values的值再迭代
2、MAP集合 鍵  是 不可重複的。
3、HashMap   作爲升級版  可以把 null作爲鍵或者值
1、添加
put(K key, V value)
putAll(Map< ? extends K,  ? extends v>M)
2、刪除
clear()
remove(Object key)
3、判斷
containsValue(Object value)
containsKey(Object kay)
isEmpty()
4、獲取
get(Object key)
size()
values()
【2】
map集合的兩種取出方式:
entrySet()【重點】
keySet()  【重點】
keySet(): 將map 中的所有鍵存入到set集合,因爲set集合具備迭代器
用迭代器取出所有鍵,通過get方法,取出鍵對應的 值
public static void main(String[] args) {
		HashMap<String,String>  hss = new HashMap<String,String>();
		hss.put("02","sm2");
		hss.put("01","sm1");
		hss.put("04","sm4");
		hss.put("03","sm3");
		//1 先獲取map集合的所有鍵的Set集合,keySet()
		Set<String> keyset=hss.keySet();
		//有了Set集合,就可以獲取迭代器。
		for(Iterator<String> it= keyset.iterator();it.hasNext() ; ){
			String key=it.next();
			//有了鍵可以通過map集合的get方法獲取其對應的值
			String value=hss.get(key);
			System.out.println(key+"----"+value);
		}
	}
entrySet():在set集合中存儲的是映射關係。
該映射關係是以Map.Entry接口的對象形式存在的,所以set的泛型就是該接口
調用 set集合的迭代器 ,將一個個Map.Entry 對象取出
然後調用該對象自帶方法,取出 鍵和值 

//2將map集合中的映射關係取出,存如到set集合中。
               Set<Map.Entry<String,String>> entryset =  hss.entrySet();
		for(Iterator<Map.Entry<String,String>> it = entryset.iterator(); it.hasNext(); ){
			Map.Entry<String,String> me=it.next();
			String key=me.getKey();
			String value=me.getValue();
			System.out.println(key+"--"+value);
		}
Entry :其實也是一個接口,MAP的子接口,可以用類實現接口,用類的內部類子接口
模擬一下:
		interface Map{
			public static interface Entry{
				public abstract Object getKey();
				public abstract Object getValue();
			}
		}
		class HashMap implements Map.Entry
		{
			class Hahs implements Map.Entry{
				public abstract Object getKey();
				public abstract Object getValue();
			}
		}
//能加 static 修飾的接口,都是內部接口
【3】
1、HashMap 不具備 比較   TreeMap才具有
class MapTest6 {
	public static void main(String[] args) {
		//TreeMap<Student,String>  hss = new TreeMap<Student,String>(new MyCom());
		//TreeMap<Student,String>  hss = new TreeMap<Student,String>();
		//HashMap<Student,String>  hss = new HashMap<Student,String>(new MyCom());
		HashMap<Student,String>  hss = new HashMap<Student,String>();
		hss.put(new Student("xua",30),"tian");
		hss.put(new Student("fds",26),"sf");
		hss.put(new Student("afdsa",17),"tfff");
		hss.put(new Student("cfdsa",27),"tfff");
		hss.put(new Student("bfdsa",27),"tfff");
		hss.put(new Student("xua",24),"tfds");
		hss.put(new Student("dsua",18),"fdsfean");
		hss.put(new Student("zuf",20),"tsd");
		for(Iterator<Student> it = hss.keySet().iterator() ; it.hasNext() ; ){
			Student s = it.next();
			String addr = hss.get(s);
			System.out.println(s+"--"+addr);
		}
	}
}
//比較方式1:--implements Comparator--比較器
class MyCom implements Comparator<Person>{

	public int compare(Person s1,Person s2){
		int num=new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		if(num==0){
			return s1.getName().compareTo(s2.getName());
		}
		return num;
	}
}
//比較方式2:--implements Comparable 
class Person implements Comparable<Person>{
	private String name;
	private int age;
	Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	//3
	public int compareTo(Person p){
		int num = this.getName().compareTo(p.getName());
		if(num == 0){
			return new Integer(this.getAge()).compareTo(new Integer(p.getAge()));
		}
		return num;
	}
	//1
	public int hashCode(){
		return name.hashCode()+age*17;
	}
	//2
	public boolean equals(Object obj){
		if(!(obj instanceof Student)){
			throw new ClassCastException("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
		}
		Person p = (Person) obj;
		return this.getName().equals(p.getName()) && this.age==p.age ;
	}
	public String toString(){
		return name+"+++++"+age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
}
class Student extends Person{
	Student(String name,int age){
		super(name,age);
	}
}
發現,不論是implements Comparator 還是 implements Comparable  都不能對HashMap 進行比較排序
 【4】
 Map 擴展知識。

Map 集合被使用是因爲具備映射關係。
案例:
一個學校有很多班級,一個班級會有很多學生,
那麼,,這學生,班級,和學校,該如何來存儲,用什麼來存儲,呢

MapTest9  是一個方法 MapTest91  是另外一個方法

本方法中,因爲班級裏的學生具有名字,和學號這種映射關係,
所以我們用2個Map集合來 裝學校, 而學校具有,班級名稱,和具體班級,
也是一種映射關係,所以把學生集合作爲值,班級名作爲鍵,進行存儲
HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
這樣就搞定了。
1、創建 學校,班級,讓學校跟班級有映射關係。
2、爲班級添加學員。當需要我們獲取某個班級的學員的時候
我們可以通過獲取班級來實現
3、編寫一個獲取班級學員信息的方法
傳入一某一個班級名稱,因爲其也是一個Map 集合,因爲Map不具備迭代器
我們把所有鍵,裝入一個collextion集合中,通過迭代器獲得班級學員編號,和名字。

4、當我們要使用上訴方法時候,必須獲取到該學校的班級。同理,使用collextion 集合來存儲
鍵,通過鍵,來獲取到所有班級, 通過在迭代器裏,進行每一次班級的傳入,而獲取所有班級的學員信息。

"yurebao"    "01"  "zhangs"
"yurebao"    "02"  "zhans"
"jiuye"    "01"  "zhangdfs"
"jiuye"    "02"  "zhangs"
【4-1】
方式2看MapTest91
>>[2]
"jiuye"  Student("01","zhangs");    
import java.util.*;
class MapTest9 {
	public static void main(String[] args) {
		//創建一個學校 
		HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
		//創建一個班級
		HashMap<String,String> yure =new HashMap<String,String>();	
		//創建一個班級
		HashMap<String,String> jiuye =new HashMap<String,String>();
		//這個時候,兩個班級和學校是沒有關係的。:
		xuexiao.put("預熱班",yure);
		xuexiao.put("就業班",jiuye);
		// 有關係後,給每個班級添加學生
		yure.put("y01","zhangs");
		yure.put("y02","lisi");
		yure.put("y03","wangw");
		jiuye.put("j01","liming");
		jiuye.put("j02","huangy");
		jiuye.put("j03","huangl");
		jiuye.put("jo4","jiangx");
		//如何獲取學校所有的學生?  提示,通過遍歷學校,獲取到所有的教室,然後。。。。
		Set<String> keyset = xuexiao.keySet();//使用一個Collection集合來把所有的鍵裝在一起。
		for(Iterator<String> it = keyset.iterator() ; it.hasNext() ;  ){
			String key = it.next(); //獲取鍵
			HashMap<String,String>  jiaoshi = xuexiao.get(key);	//注意班級的類型 獲取班級		
            System.out.println("輸出看看獲取的班級:"+key+"\n\n");
			ShowBanji(jiaoshi);//獲取班級具體信息
		}	
	}
	//獲取指定某個班級的學生信息。
	public static void ShowBanji(HashMap<String,String> roommap){
		Set<String> keyset=roommap.keySet();//使用一個Collection集合來把所有的鍵裝在一起。
		for(Iterator<String> it = keyset.iterator() ; it.hasNext() ; ){
			String id = it.next();
			String name = roommap.get(id);
			System.out.println(id+"----"+name);
		}
	}
}
【4-2】
方式二   -------對比
"jiuye"  Student("01","zhangs");    
上訴方法是通過班級創建學生的方式來完成的,
因爲萬物皆對象,其實學生也是一個對象,
那麼我們接下來的方法就是把學生信息直接封裝爲對象進行操作。

當把學生信息封裝爲一個對象,這個時候,就不存在映射關係,
那麼就不用map集合了,那麼用什麼集合了,collcetion 裏有兩個集合,一個list,set 集合
如果不考慮重複性,我們就用list 集合
1、創建學校集合,班級集合,學生。
2、獲取班級
3、根據班級獲取學生。
class MapTest91 {
	public static void main(String[] args) {
		//同樣創建一個學校,只是HashMap變爲了list
		HashMap<String,List<Student>> xuex = new HashMap<String,List<Student>>();
		//創建2個班級
		List yure = new ArrayList<Student>();
		List jiuye = new ArrayList<Student>();
		//創建關係
		xuex.put("預熱班級",yure);
		xuex.put("就業班級",jiuye);
		yure.add(new Student("yy1","zzz"));
		yure.add(new Student("yy2","zfdszz"));
		jiuye.add(new Student("jj1","azzez"));
		jiuye.add(new Student("yjj2","zdszz"));
		for(Iterator<String> it = xuex.keySet().iterator() ; it.hasNext() ; ){
			//Iterator<String> it = xuex.keySet().iterator();
			//while(it.hasNext()){  //兩種循環方式。
				String key =it.next();//班級名稱
				List<Student> room = xuex.get(key);
				System.out.println(key+"|");
				getInfo(room);
			}
	}
	public static void getInfo(List<Student> stu){
		//循環方式2    切記collcetion集合中都是單列沒有get方法,不要和Map集合搞混淆了。
		//Iterator<Student> it = stu.iterator();
		//while(it.hasNext()){
		//	Student no = it.next();
		//	System.out.println(no);
		//}
		//
		for(Iterator<Student> it = stu.iterator() ; it.hasNext() ; ){
			Student key = it.next();
			System.out.println(key+"---");//因爲覆蓋了toString方法,所以這裏可以直接輸出。
			}			
	}
}
//學生類
class Student{
	private String no;
	private String name;
	Student(String no,String name){
		this.no = no;
		this.name = name;
	}
	public String getNo(){
		return no;
	}
	public String getName(){
		return name;
	}
	public String toString(){
		return no+"=-"+name;
	}
}
充分利用萬物皆對象,就是說,儘量進行封裝。方便操作。






---------------------------------------------------------------------------------------------------------------------------------------------
---------- android培訓、 java培訓、期待與您交流!----------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章