Java集合框架——Map介面
在實際需求中,我們常常會遇到這樣的問題,在諸多的資料中,通過其編號來尋找某一些資訊,從而進行檢視或者修改,例如通過學號查詢學生資訊。今天我們所介紹的Map集合就可以很好的幫助我們實現這種需求
(一) 概述及功能
(1) 概述
Map是一種儲存元素對的集合(元素對分別稱作 鍵 和 值 也稱鍵值對)它將鍵對映到值的物件。一個對映不能包含重複的鍵,並且每個鍵最 多隻能對映到一個值。
怎麼理解呢?
鍵 (key):就是你存的值的編號 值 (value):就是你要存放的資料
你可以近似的將鍵理解為下標,值依據鍵而儲存,每個鍵都有其對應值。這兩者是1、1對應的
但在之前下標是整數,但是Map中鍵可以使任意型別的物件。
Map集合和Collection集合的區別?
- Map集合儲存元素是成對出現的,Map集合的鍵是唯一的,值是可重複的
- Collection集合儲存元素是單獨出現的,Collection的子類Set是唯一的,List是可重複的。
- Map集合的資料結構值針對鍵有效,跟值無關,Collection集合的資料結構是針對元素有效
(2) 功能
A:新增功能
//新增元素
V put(K key,V value)
//如果鍵是第一次儲存,就直接儲存元素,返回null
//如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
B:刪除功能
//移除所有的鍵值對元素 void clear() //根據鍵刪除鍵值對元素,並把值返回 V remove(Object key)
C:判斷功能
//判斷集合是否包含指定的鍵
boolean containsKey(Object key)
//判斷集合是否包含指定的值
boolean containsValue(Object value)
//判斷集合是否為空
boolean isEmpty()
D:獲取功能
//將map集合中的鍵和值對映關係打包為一個物件 Set<Map.Entry<K,V>> entrySet() //根據鍵獲取值 V get(Object key) //獲取集合中所有鍵的集合 Set<K> keySet() //獲取集合中所有值的集合 Collection<V> values()
E:長度功能
//返回集合中的鍵值對的對數
int size()
(二) Map集合的遍歷
package cn.bwh_01_iterator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> hm = new HashMap<String, String>();
hm.put("bwh002", "i");
hm.put("bwh001", "love");
hm.put("bwh003", "you");
//方式一 鍵找值
Set<String> set = hm.keySet();
//迭代器遍歷
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = it.next();
String value = hm.get(key);
System.out.println(key + "---" + value);
}
//增強for遍歷
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);
}
//方式二 鍵值對物件找鍵和值(推薦)
Set<Map.Entry<String, String>> set2 = hm.entrySet();
//迭代器遍歷
Iterator<Map.Entry<String, String>> it2 = set2.iterator();
while (it2.hasNext()) {
//返回的是封裝了key和value物件的Map.Entry物件
Map.Entry<String, String> entry = it2.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "---" + value);
}
//增強for遍歷
for (Map.Entry<String, String> me : set2) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "---" + value);
}
}
}
(三) Map及子類總結
Map(雙列集合)
-
Map集合的資料結構僅僅針對鍵有效,與值無關。
-
儲存的是鍵值對形式的元素,鍵唯一,值可重複
HashMap
-
底層資料結構是雜湊表,執行緒不安全,效率高
-
雜湊表依賴兩個方法:hashCod()和equals()
-
執行順序:
- 首先判斷hashCode()值是否相同
- 是:繼續執行equals(),看其返回值
- 是true:說明元素重複,不新增
- 是false:就直接新增到集合
- 否:就直接新增到集合
- 是:繼續執行equals(),看其返回值
- 首先判斷hashCode()值是否相同
-
最終:
-
自動生成hashCode()和equals()即可
LinkeHashMap
-
底層資料結構是由連結串列和雜湊表組成
-
由連結串列保證元素有序
-
由雜湊表保證元素唯一
Hashtable
- 底層資料結構是雜湊表
- 雜湊表依賴兩個......自動生成hashCode()和equals()即可
TreeMap
- 底層資料結構是紅黑樹(是一種自平衡的二叉樹)
如何保證元素唯一性呢?
- 根據比較的返回值是否是0來決定
如何保證兩種元素的排序呢?
- 自然排序(元素具備比較性)
- 讓元素所屬的類實現comparable介面
- 比較器排序(集合具備比較性)
- 讓集合接收一個comparator的實現類物件
可以多層巢狀
HashMap集合巢狀HashMap
HashMap集合巢狀ArrayList
ArrayList集合巢狀HashMap
HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>
1:Hashtable和HashMap的區別?
**Hashtable**:執行緒安全,效率低。不允許null鍵和null值
**HashMap**:執行緒不安全,效率高。允許null鍵和null值
(其實HashMap就是用來替代Hashtable的,就像ArrayList替代vector一樣)
2:List,Set,Map等介面是否都繼承子Map介面?
List,Set不是繼承自Map介面,它們繼承自Collection介面
Map介面本身就是一個頂層介面
需要排序:TreeMap
不需要排序:HashMap
不知道具體需求:HashMap
(四) 經典案例
(1) 統計字串中字元出現的次數
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
/*
* 案例(統計字串中字元出現的次數)
* 需求:
* 獲取一個字串出現的次數
* 分析:
* A:定義一個字串(或者鍵盤錄入)
* B: 定義一個TreeMap集合
* 鍵:Character
* 值:Integer
* C:把字串轉換為字元陣列
* D: 遍歷字元陣列,得到每一個字元
* E: 拿剛才得到的字元作為鍵去集合中找,看返回值
* 是 null:說明該鍵不存在,就把該字串作為鍵,1作為值去儲存
* 不是 null:說明該鍵存在,就把值加 1 然後重寫儲存該鍵和值
* F: 定義字串緩衝區變數
* G:遍歷集合,得到該建和值,按照要求拼接
* H:最後把字串緩衝區轉換為字串輸出
*/
public class CountDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入需要統計的資料");
String line = sc.nextLine();
Map<Character, Integer> tm = new TreeMap<Character, Integer>();
char[] chs = line.toCharArray();
for (char ch : chs) {
Integer i = tm.get(ch);
if (i == null) {
tm.put(ch, 1);
} else {
i++;
tm.put(ch, i);
}
}
StringBuilder s = new StringBuilder();
Set<Character> set = tm.keySet();
for (Character key : set) {
Integer value = tm.get(key);
s.append(key).append("(").append(value).append(")" + " ");
}
String result = s.toString();
System.out.println("result: " + result);
}
}
//執行結果
請輸入需要統計的資料
HelloWorld
result: H(1) W(1) d(1) e(1) l(3) o(2) r(1)
(2) 模擬鬥地主案例
在講解這個案例之前,我們先來了解一個我們下面案例中所需要知道的知識點
Collections 工具類
Collections:是針對集合進行操作的工具類,都是靜態方法。
面試題:
Collection和Collections的區別?
Collection:是單列集合的頂層介面,有子介面List和Set。(Map是雙列的)
Collections:是針對集合操作的工具類,有對集合進行排序和二分查詢的方法
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)
如果同時有自然排序和比較器排序,以比較器排序為主(也就是說,當同時實現了Student類的自然排序(implements Comparable<Student>)以及比較器排序的話(new Comparator<Student>()),比較器排序會覆蓋自然排序)
//鬥地主案例程式碼
package cn.bwh_03_PokerGame;
import java.util.*;
public class PokerGame {
public static void main(String[] args) {
HashMap<Integer, String> hm = new HashMap<Integer, String>();
ArrayList<Integer> array = new ArrayList<Integer>();
String[] colors = {"♥", "♠", "♣", "♦"};
String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
int index = 0;
for (String number : numbers) {
for (String color : colors) {
String poker = color.concat(number);
hm.put(index, poker);
array.add(index);
index++;
}
}
hm.put(index, "小王");
array.add(index);
index++;
hm.put(index, "大王");
array.add(index);
index++;
//洗牌
Collections.shuffle(array);
//發牌(發的是編號,為了保證編號是排序的,使用TreeSet接收)
TreeSet<Integer> player1 = new TreeSet<Integer>();
TreeSet<Integer> player2 = new TreeSet<Integer>();
TreeSet<Integer> player3 = new TreeSet<Integer>();
TreeSet<Integer> handcards = new TreeSet<Integer>();
for (int x = 0; x < array.size(); x++) {
if (x >= array.size() - 3) {
handcards.add(array.get(x));
} else if (x % 3 == 0) {
player1.add(array.get(x));
} else if (x % 3 == 1) {
player2.add(array.get(x));
} else if (x % 3 == 2) {
player3.add(array.get(x));
}
}
System.out.println("---------------------歡樂鬥地主----------------------");
//看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)
lookpocker("player1", player1, hm);
lookpocker("player2", player2, hm);
lookpocker("player3", player3, hm);
lookpocker("預留", handcards, hm);
}
//看牌功能實現
public static void lookpocker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
System.out.println(name + "的牌是:");
for (Integer key : ts) {
String value = hm.get(key);
System.out.print(value + " ");
}
System.out.println();
}
}
結尾:
如果內容中有什麼不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關注我吧!(系列文章均會在公眾號第一時間更新)
在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤
一個堅持推送原創Java技術的公眾號:理想二旬不止
相關推薦
java集合框架-Map介面
map是一個鍵值對對映物件,一個map不能包含重複的key,每一個key都能唯一的對映到至多一個value. 這個介面替代了Dictonary類。map介面提供了三種集合檢視,它允許將map的內容視為一個鍵集合、值集合或者鍵值對映集合。map的順序被定義為集合檢視的迭代器返
Java集合框架——Map介面
在實際需求中,我們常常會遇到這樣的問題,在諸多的資料中,通過其編號來尋找某一些資訊,從而進行檢視或者修改,例如通過學號查詢學生資訊。今天我們所介紹的Map集合就可以很好的幫助我們實現這種需求 (一) 概述及功能 (1) 概述 Map是一種儲存元素對的集合(元素對分別稱作 鍵 和 值 也稱鍵值對)它將鍵對
JAVA集合框架Collection介面和Map介面主要知識總結
Java集合框架下有兩個重要的介面,一個是Collection介面,一個是Map介面。 一、Collection介面 Collection介面中又有三個子介面,分別是List(序列),Queue(佇列),Set(集), 其中常用的有List和Set; List和Qu
Java 知識點整理-12.Java集合框架 Map+HashMap+LinkedHashMap+TreeMap+Collections+泛型固定下邊界+集合框架總結
目錄 Map集合概述和特點 HashMap LinkedHashMap TreeMap HashMap Collections類 泛型固定下邊界 集合框架總結 Map集合概述和特點 1、Map介面概述: public interface Map
第三十五講 集合框架——Map介面
Map介面的概述 將鍵對映到值的物件,一個對映不能包含重複的鍵,每個鍵最多隻能對映到一個值。其實Map集合是一個雙列集合,儲存的就是鍵值對,而且Map集合中必須保證鍵的唯一性。 Map介面的特點 Map與Collection在集合框架中屬並列存在,而且Map是雙列的,
Java集合框架頂層介面collectiion介面
如何使用迭代器 通常情況下,你會希望遍歷一個集合中的元素。例如,顯示集合中的每個元素。 一般遍歷陣列都是採用for迴圈或者增強for,這兩個方法也可以用在集合框架,但是還有一種方法是採用迭代器遍歷集合框架,它是一個物件,實現了Iterator 介面或ListIterator介面。 迭代器,使你能夠通過迴
Java集合框架的介面和類層次關係結構圖
集合框架中的核心介面 介面 說明 實體類 Collection 一種基本介面,它定義了一些普通操作,通過這些操作,可以將一個物件集合當作一個獨立單元來對其進行存放和處理 Set Set介面擴充套件了Collection介面,用
java集合框架的介面概述
java平臺的集合介面所定義的函式是通用的,例如:Collection<E>,但是實現可以選擇的支援相關操作,當執行沒有被支援的操作時,拋UnsupportedOperationException.異常,有幸的時,java平臺的各種集合都實現了相關操作。附上集合核
Java集合框架——List介面
第三階段 JAVA常見物件的學習 集合框架——List介面 按照集合框架的繼承體系,我們先從Collection中的List介
Java集合框架——Set介面
List集合的特點是有序的,可重複的,是不是存在這一種無序,且能保證元素唯一的集合呢?(HashSet )這就涉及到我們今天所要講的Set集合 Set可以理解為行為不同的Collection (一) 概述及功能 (1) 概述 Collection List —— 有序(儲存順序和取出順序一致),可重
JAVA基礎第五章-集合框架Map篇 JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多型 JAVA基礎第三章-類與物件、抽象類、介面 JAVA基礎第四章-集合框架Collection篇
業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 我將會持續更新java基礎知識,歡迎關注。 往期章節: JAVA基礎第一章-初識java
Java集合框架詳解之繼承map介面
趁著最近比較閒,靜下心來準備把關於集合框架的東西好好整理一下,邊學邊整理。近階段先是整理整體的知識點,一些介面,一些繼承類以及它們的特性,用法,後續還會有一些常用的,比較重要的類的jdk原始碼剖析。 map介面: Map 提供 Key 到 Value
JAVA-初步認識-常用對象API(集合框架-Map集合-hashmap存儲自定義對象)
自定義 。。 成對 ... 都差不多 post 哈希表 equals方法 例子 一. 把前面講到的三個集合使用一下。 交代一下需求,學生是鍵,歸屬地是值。到底歸屬地是不是String,有待商榷。如果歸屬地比較簡單,用天津,上海....這些就是字符串。如果歸屬地比較復雜,北京
Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap
getprop color name 找到 文件 remove style 情況 read Map Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value
Java當中的集合框架Map
簡書作者:達叔小生 Java當中的集合框架Map 01 Map提供了三個集合檢視: 鍵集 值集 鍵-值 對映集 public String getWeek(int num){ if(num<0 || num>
Java集合類根介面:Collection 和 Map
前言 在前文中我們瞭解了幾種常見的資料結構,這些資料結構有著各自的應用場景,並且被廣泛的應用於程式語言中,其中,Java中的集合類就是基於這些資料結構為基礎。 Java的集合類是一些非常實用的工具類,主要用於儲存和裝載資料 (包括物件),因此,Java的集合類也被成為容器。在Java中,所有的集合類都位於
Java 知識點整理-9.Java集合框架 集合概述+Collection介面+Iterator介面+迭代器+List介面+併發修改異常+ListIterator介面+Vector類+List子類
本章會用大量程式碼做具體演示。統一說明:返回型別E在JDK1.5之前是Object,1.5之後等泛型再講。 先介紹一個偶然發現的快捷鍵和一個很實用的快捷鍵: Alt + Shift + N 快速呼叫建立選單。直接按開頭的首字母進行建立即可,某些時候感覺比Ctrl + N更快捷。
Java集合框架15:Map集合
Map介紹 1、將值對映到值的物件。 2、一個對映不能包含重複的鍵。 3、每個鍵最多隻能對映到一個值。 Map介面和Collection介面的不同 1、Map是雙列的,Collection是單列的。 2、Map的鍵唯一,Collection的子體系Set
Java集合框架 四種遍歷Map的方法
package chapter07; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Test2 { public static void main(String[]
基於原始碼的Java集合框架學習⑭ Map總結
Map概括 Map 是“鍵值對”對映的抽象介面。 AbstractMap 實現了Map中的絕大部分函式介面。它減少了“Map的實現類”的重複編碼。 SortedMap 有序的“鍵值對”對映介面。 NavigableMap 是繼承於SortedMap的,支援導航函式的介面。