集合(四)Map

 Collection集合和Map集合的區別:java

          a: Map集合屬於雙列集合 , Collection屬於單列集合 安全

          b: Map集合鍵是惟一性的, 而Collection集合中的Set集合能夠保證元素的惟一性數據結構

          c: Map集合的數據結構只和鍵有關係 ,和值沒有關係 , 而Collection集合的數據結構和元素有關係app

  Map集合是一個接口 , 接口不能直接實例化 , 若是咱們要對其進行實例化,那麼就須要使用子類 , HashMap 和  TreeMapide

 Map集合的功能概述:工具

a: 添加元素學習

  V put(K key, V value)         添加元素測試

  b: 刪除元素ui

  void clear() 刪除全部的元素spa

  V remove(Object key) 根據鍵刪除元素

  c: 獲取元素

  V get(Object key) 根據鍵獲取值

  Set<K> keySet() 獲取全部的鍵對應的Set集合

  int size() 獲取集合的長度

  Collection<V> values() 獲取全部的值對應Collection

  d: 判斷該功能

  boolean containsKey(Object key) 判斷是否包含某一個鍵

  boolean containsValue(Object value) 判斷是否包含某一個值

  boolean isEmpty() 判斷集合是否爲空

  e: 遍歷Map集合

                (1) 鍵找值

           分析:

       a: 獲取全部的鍵對應的Set集合

       b: 遍歷這個Set集合, 獲取每個元素 , 而每個元素就是鍵 , 而後根據當前遍歷的鍵獲取對應的值

        

                (2)根據鍵值對象遍歷集合

      Set<Map.Entry<K,V>> entrySet(): 獲取的是全部的鍵值對對象對應的set集合

                  分析:

      a: 調用entrySet方法獲取全部的鍵值對對象對應的Set集合

      b: 遍歷這個Set集合, 獲取每個元素,而每個元素應該是鍵值對對象 , 而後咱們調用方法 ,從這個鍵值對對象中獲取對應的鍵和值

    HashMap的兩種遍歷方式:

* 請編寫程序,存儲自定義對象到HashMap集合中,並採用兩種方式遍歷
 */
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo {
	public static void main(String[] args) {
		Student s1 = new Student("李時珍",50);
		Student s2 = new Student("蒲松齡",39);
		Student s3 = new Student("曹雪芹",41);
		
		//1.建立HashMap對象,鍵爲String類型,值爲Student類型
		HashMap<String, Student> hs = new HashMap<String,Student>();
		//將自定義對象加入集合
		hs.put("本草綱目", s1);
		hs.put("聊齋志異", s2);
		hs.put("紅樓夢", s3);
		//遍歷,根據鍵獲取對象
		Set<String> keySet = hs.keySet();
		for(String k:keySet){
			Student st = hs.get(k);
			System.out.println(k+"---"+st.getName()+"---"+st.getAge());
		}
		
		System.out.println("----------------------------------------");
		//2.建立HashMap對象,key爲Student類,value爲String類型
		HashMap<Student,String> hs2 = new HashMap<Student,String>();
		
		//將自定義對象加入集合
		hs2.put(s3, "紅樓夢");
		hs2.put(s2, "聊齋志異");
		hs2.put(s1, "本草綱目");
		
		//遍歷,使用entrySet方法,將全部鍵值對的對象存入Set集合中,而後根據鍵值對象獲取鍵與值
		Set<Entry<Student, String>> entrySet = hs2.entrySet();
		for(Entry<Student, String> en : entrySet){
			Student st = en.getKey();
			System.out.println(st.getName()+"---"+st.getAge()+"---"+en.getValue());
		}
	}
}

/*
 * 紅樓夢---曹雪芹---41
聊齋志異---蒲松齡---39
本草綱目---李時珍---50
----------------------------------------
李時珍---50---本草綱目
曹雪芹---41---紅樓夢
蒲松齡---39---聊齋志異

 */

TreeMap:

TreeMap集合的特色: 底層的數據結構是二叉樹, 能夠對元素進行排序

  而排序有兩種方式

   第一種是天然排序 public TreeMap()

  對元素有要求 , 要求元素必須實現 Comparable 接口

  第二種是比較器排序 public TreeMap(Comparator comparator)

   咱們到底使用的是天然排序仍是比較器排序主要依賴於構造方法  

                Map集合的數據結構只和鍵有關係,和值沒有關係

TreeMap的兩種遍歷方式

/*
 * 請編寫程序,存儲自定義對象到TreeMap集合中,並採用兩種方式遍歷.
 */

import java.util.Map.Entry;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;


public class TreeMapDemo {
	public static void main(String[] args) {
		//建立自定義對象
		Student s1 = new Student("曹雪芹",41);
		Student s2 = new Student("蒲松齡",39);
		Student s3 = new Student("李時珍",50);
		//使用TreeMap類中的比較器進行排序
		TreeMap<Student, String> tm = new TreeMap<Student,String>(new Comparator<Student>() {
			//重寫Comparator的compare方法
			@Override
			public int compare(Student st1, Student st2) {
				// TODO Auto-generated method stub
				//比較年齡
				int num = st1.getAge()-st2.getAge();
				//比較姓名
				int num2 = (num==0)?st1.getName().compareTo(st2.getName()):num;
				return num2;
			}
				
		
		}		
				);
		//將鍵值對添加入TreeSet集合中
		tm.put(s3, "本草綱目");
		tm.put(s2, "聊齋志異");
		tm.put(s1, "紅樓夢");
		//1.使用鍵值對對象遍歷TreeMap集合
		//將TreeSet鍵值對對象存儲到set集合中
		Set<Entry<Student, String>> entrySet = tm.entrySet();
		//用鍵值對對象獲取key,value值
		for(Entry<Student, String> en :entrySet){
			Student key = en.getKey();
			String value = en.getValue();
			System.out.println(key.getName()+"---"+key.getAge()+"----"+value);
		}
		//2.根據獲取到的key去獲取value
		System.out.println("-----------------------------------------------------------");
		Set<Student> st = tm.keySet();
		//遍歷
		for(Student sNum:st){
			System.out.println(sNum.getName()+"---"+sNum.getAge()+"---"+tm.get(sNum));
		}
			
	}
}
/*
 * 結果:
 蒲松齡---39----聊齋志異
曹雪芹---41----紅樓夢
李時珍---50----本草綱目
-----------------------------------------------------------
蒲松齡---39---聊齋志異
曹雪芹---41---紅樓夢
李時珍---50---本草綱目
 */

最後再舉幾個使用Map集合的例子

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*
 * 需求:統計字符串中每一個字符出現的次數	"aababcabcdabcde",獲取字符串中每個字母出現的次數要求結果:a(5)b(4)c(3)d(2)e(1)
 * 
 * 要點:1.根據HashMap集合的特色去存儲字符的出現次數
 * 2.對於HashMap的遍歷方式進行學習與理解
 * 3.選用StringBuffer進行拼接,減小內存資源的消耗
 * 4.更優的方式是使用StringBuilder進行拼接,由於StringBuffer是線程安全的,拼接速度較慢。StringBuilder是線程不安全的,
 * 適用於單線程任務,速度更快
 */

public class HashMapTest {
	public static void main(String[] args) {
		//定義一個字符串
		String st = "aababcabcdabcde";
		//建立一個HashMap集合
		HashMap<Character,Integer> hs = new HashMap<Character,Integer>();
		//遍歷字符串,將字符串添加到HashMap集合中去
		for(int i = 0;i<st.length();i++){
			char charAt = st.charAt(i);
			//將要查找的字符做為鍵,去HashMap中去查找
			Integer num = hs.get(charAt);
			//若是不存在,將其值num賦值爲1
			if(num==null){
				hs.put(charAt, 1);
			}
			//若是已經存在該鍵,將該鍵的值+1,
			else{
				num++;
				hs.put(charAt, num);
			}
		}
		//測試HashMap中的結果
		//System.out.println(hs);
		//建立StringBuffer對象,按照要求進行拼接
		StringBuffer stb = new StringBuffer();
		//遍歷HashMap集合,按照指定格式進行輸出
		//將HashMap集合對對象存儲到Set集合中
		Set<Entry<Character, Integer>> entrySet = hs.entrySet();
		//分別獲取Set集合中的鍵值對對象的key,value值,而後進行拼接
		for( Entry<Character, Integer>  en:entrySet){
			stb.append(en.getKey()).append("(").append(en.getValue()).append(")");
		}
		//輸出
		System.out.println(stb.toString());
	}
	
}
/*結果:
 * a(5)b(4)c(3)d(2)e(1)
 */

集合嵌套的使用

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*集合嵌套實例:
 * HashMap的嵌套
 *明:
 *	李時珍 本草綱目   
 *清:
 *	曹雪芹 紅樓夢
 *	蒲松齡 聊齋志異
 */
public class HashMapNest {
	public static void main(String[] args) {
		//建立嵌套HashMap集合對象
		HashMap<String,HashMap<String, String>> hm = new HashMap<String,HashMap<String,String>>();
		
		//建立明朝做者,書籍集合對象
		HashMap<String, String> hMing = new HashMap<String,String>();
		
		//添加明朝集合中的key,value值		
		hMing.put("李時珍", "本草綱目");		
		//建立清朝做者,書籍對象
		HashMap<String, String> hQing = new HashMap<String,String>();
		hQing.put("蒲松齡", "聊齋志異");
		hQing.put("曹雪芹", "紅樓夢");
		//將小範圍集合添加進大範圍集合中
		hm.put("明", hMing);
		hm.put("清", hQing);
		//遍歷集合
		//獲取外集合鍵值對對象
		Set<Entry<String, HashMap<String, String>>> entrySet = hm.entrySet();
		for(Entry<String, HashMap<String, String>> en:entrySet){
			//獲取鍵值
			String key1 = en.getKey();
			System.out.println(key1+":");
			//獲取外集合value值(即內集合)
			HashMap<String,String> hm2 = en.getValue();
			//獲取內集合鍵值對對象
			Set<Entry<String, String>> entrySet2 = hm2.entrySet();
			for(Entry<String, String> en2:entrySet2){
				//獲取內集合鍵值
				String key2 = en2.getKey();
				System.out.println(key2+"---"+en2.getValue());
			}
			
		}
		
	}
}

/*
 清:
蒲松齡---聊齋志異
曹雪芹---紅樓夢
明:
李時珍---本草綱目
 */



HashMap和HashSet的區別 

        HashMap 線程不安全 , 效率高 , 容許存在null值和null鍵

        Hashtable 線程安全, 效率低 , 不容許在null值和null鍵

Collections

                        集合工具類,該類中提供了不少操做集合的方法

public static <T> void sort(List<T> list): 排序,默認按照天然順序

public static <T> int binarySearch(List<?> list,T key): 二分查找

public static <T> T max(Collection<?> coll): 獲取最大值

public static void reverse(List<?> list): 反轉

public static void shuffle(List<?> list):隨機置換

相關文章
相關標籤/搜索