【java】【Map】HashMap、Hashtable、Collections

love_Aym發表於2018-05-02

一、基本概述

鍵值對:一個對映不能包含重複的鍵,每個鍵最多隻能對映到一個值


Map介面和Collection介面的不同

  •  Map是雙列的,Collection是單列的
  • Map的鍵唯一,Collection的子體系Set是唯一的
  • Map集合的資料結構值針對鍵有效,跟值無關。Collection集合的資料結構是針對元素有效。

二、Map集合的功能

1、新增功能

  • V  put(Kkey,V value):新增元素。

            * 如果鍵是第一次儲存,就直接儲存元素,返回null

            * 如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值

2、刪除功能

        * void clear():移除所有的鍵值對元素

        * V  remove(Object key):根據鍵刪除鍵值對元素,並把值返回

 3、判斷功能

        * boolean  containsKey(Object key):判斷集合是否包含指定的鍵

        * boolean  containsValue(Object value):判斷集合是否包含指定的值

        * boolean  isEmpty():判斷集合是否為空

4、獲取功能

        *Set<Map.Entry<K,V>>  entrySet():

                說明:Map.Entry表示Entry是Map的內部介面,將鍵和值封裝成了Entry物件,並儲存在Set集合中

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

        *Set<K>  keySet():獲取集合中所有鍵的集合

        *Collection<V>  values():獲取集合中所有值的集合

5、長度功能

        * intsize():返回集合中的鍵值對的個數

三、Map集合的遍歷

1、鍵找值 思路:

    * 獲取所有鍵的集合

    * 遍歷鍵的集合,獲取到每一個鍵

    * 根據鍵找值

HashMap<String, Integer> hm = new HashMap<>();
hm.put("張三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("趙六", 26);
			
Set<String> keySet = hm.keySet();		//獲取集合中所有的鍵
Iterator<String> it = keySet.iterator();	//獲取迭代器
while(it.hasNext()) {				//判斷單列集合中是否有元素
	String key = it.next();			//獲取集合中的每一個元素,其實就是雙列集合中的鍵
	Integer value = hm.get(key);		//根據鍵獲取值
	System.out.println(key + "=" + value);	//列印鍵值對
}
			
for(String key : hm.keySet()) {			//增強for迴圈迭代雙列集合第一種方式
	System.out.println(key + "=" + hm.get(key));
}

2、鍵值對物件找鍵和值  思路

    * 獲取所有鍵值對物件的集合

    * 遍歷鍵值對物件的集合,獲取到每一個鍵值對物件

    * 根據鍵值對物件找鍵和值

HashMap<String, Integer> hm = new HashMap<>();
hm.put("張三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("趙六", 26);
/*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();	//獲取所有的鍵值物件的集合
Iterator<Entry<String, Integer>> it = entrySet.iterator();      //獲取迭代器
while(it.hasNext()) {
	Entry<String, Integer> en = it.next();			//獲取鍵值對物件
	String key = en.getKey();				//根據鍵值對物件獲取鍵
	Integer value = en.getValue();				//根據鍵值對物件獲取值
	System.out.println(key + "=" + value);
}*/
			
for(Entry<String,Integer> en : hm.entrySet()) {
	System.out.println(en.getKey() + "=" + en.getValue());
}

四、LinkedHashMap,TreeMap

LinkedHashMap:底層是連結串列實現的可以保證怎麼存就怎麼取

TreeMap:底層是二叉樹,會對鍵值對進行排序


五、案例:統計字串中每個字元出現的次數

分析:
1、定義一個需要被統計字元的字串
2、將字串轉換為字元陣列
3、定義雙列集合,儲存字串中字元以及字元出現的次數
4、遍歷字元陣列獲取每一個字元,並將字元儲存在雙列集合中
5、儲存過程中要做判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
6、列印雙列集合獲取字元出現的次數

import java.util.HashMap;
public class Test1 {	
	public static void main(String[] args) {
		//1,定義一個需要被統計字元的字串
		String s = "aaaabbbbbccccccccccccc";
		//2,將字串轉換為字元陣列
		char[] arr = s.toCharArray();
		//3,定義雙列集合,儲存字串中字元以及字元出現的次數
		HashMap<Character, Integer> hm = new HashMap<>();
		//4,遍歷字元陣列獲取每一個字元,並將字元儲存在雙列集合中
		for(char c: arr) {
			//5,儲存過程中要做判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
			/*if(!hm.containsKey(c)) {			//如果不包含這個鍵
				hm.put(c, 1);
			}else {
				hm.put(c, hm.get(c) + 1);
			}*/
			hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
		}
		//6,列印雙列集合獲取字元出現的次數
		
		for (Character key : hm.keySet()) {				//hm.keySet()代表所有鍵的集合
			System.out.println(key + "=" + hm.get(key));//hm.get(key)根據鍵獲取值
		}
	}
}

六、HashMap和Hashtable的區別

  • Hashtable是JDK1.0版本出現的,是執行緒安全的,效率低,HashMap是JDK1.2版本出現的,是執行緒不安全的,效率高
  • Hashtable不可以儲存null鍵和null值,HashMap可以儲存null鍵和null值

七、Collections

針對集合操作 的工具類

  • public static <T> void sort(List<T> list)

  •  publicstatic <T> int binarySearch(List<?> list,T key):二分查詢法

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

publicstatic void shuffle(List<?> list):隨機置換,可以用來洗牌

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





相關文章