摘要:第三階段常見對象的學習集合框架集合在實際需求中,我們常常會遇到這樣的問題,在諸多的數據中,通過其編號來尋找某一些信息,從而進行查看或者修改,例如通過學號查詢學生信息。面試題和的區別是單列集合的頂層接口,有子接口和。
第三階段 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>?entrySet() //根據鍵獲取值 V?get(Object?key) //獲取集合中所有鍵的集合 Set ?keySet() //獲取集合中所有值的集合 Collection ?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(三) Map及子類總結 Map(雙列集合)hm = new HashMap (); hm.put("bwh002", "i"); hm.put("bwh001", "love"); hm.put("bwh003", "you"); //方式一 鍵找值 Set set = hm.keySet(); //迭代器遍歷 Iterator 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 > set2 = hm.entrySet(); //迭代器遍歷 Iterator > it2 = set2.iterator(); while (it2.hasNext()) { //返回的是封裝了key和value對象的Map.Entry對象 Map.Entry entry = it2.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "---" + value); } //增強for遍歷 for (Map.Entry me : set2) { String key = me.getKey(); String value = me.getValue(); System.out.println(key + "---" + value); } } }
Map集合的數據結構僅僅針對鍵有效,與值無關。
存儲的是鍵值對形式的元素,鍵唯一,值可重復
HashMap底層數據結構是哈希表,線程不安全,效率高
哈希表依賴兩個方法:hashCod()和equals()
執行順序:
首先判斷hashCode()值是否相同
是:繼續執行equals(),看其返回值
是true:說明元素重復,不添加
是false:就直接添加到集合
否:就直接添加到集合
最終:
自動生成hashCode()和equals()即可
LinkeHashMap底層數據結構是由鏈表和哈希表組成
由鏈表保證元素有序
由哈希表保證元素唯一
Hashtable底層數據結構是哈希表
哈希表依賴兩個......自動生成hashCode()和equals()即可
TreeMap底層數據結構是紅黑樹(是一種自平衡的二叉樹)
如何保證元素唯一性呢?
根據比較的返回值是否是0來決定
如何保證兩種元素的排序呢?
自然排序(元素具備比較性)
讓元素所屬的類實現comparable接口
比較器排序(集合具備比較性)
讓集合接收一個comparator的實現類對象
可以多層嵌套
HashMap集合嵌套HashMap
HashMap集合嵌套ArrayList
ArrayList集合嵌套HashMap
HashMap
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(); Maptm = new TreeMap (); 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 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??void?sort(List ?list) //二分查找 public?static? ?int?binarySearch(List>?list,T?key) //最大值 public?static? ?T?max(Collection>?coll) //反轉(逆序排序) public?static?void?reverse(List>?list) //隨機置換(猶如洗牌,每次運行結果不一樣) public?static?void?shuffle(List>?list) 如果同時有自然排序和比較器排序,以比較器排序為主(也就是說,當同時實現了Student類的自然排序(implements?Comparable )以及比較器排序的話(new?Comparator ()),比較器排序會覆蓋自然排序)
//斗地主案例代碼 package cn.bwh_03_PokerGame; import java.util.*; public class PokerGame { public static void main(String[] args) { HashMap結尾:hm = new HashMap (); ArrayList array = new ArrayList (); 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 player1 = new TreeSet (); TreeSet player2 = new TreeSet (); TreeSet player3 = new TreeSet (); TreeSet handcards = new TreeSet (); 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 ts, HashMap hm) { System.out.println(name + "的牌是:"); for (Integer key : ts) { String value = hm.get(key); System.out.print(value + " "); } System.out.println(); } }
如果內容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關注我吧!(系列文章均會在公眾號第一時間更新)
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創Java技術的公眾號:理想二旬不止
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75238.html
集合接口 核心集合接口封裝了不同類型的集合,如下圖所示,這些接口允許獨立于其表示的細節來操縱集合,核心集合接口是Java集合框架的基礎,如下圖所示,核心集合接口形成層次結構。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類推,另請注意,層次結構...
摘要:接口下面包含等。但是接口并沒有繼承接口,因此無法迭代。分離出接口是迭代器模式。但是接口又提供了接口以后將轉換成集合來迭代。的增強循環也只適用于那些繼承了接口的。 Iterator接口是Collection接口的父接口。Collection接口下面包含List,Set,Queue等。 Map接口與Collection接口同級。但是Map接口并沒有繼承Iterator接口,因此無法迭代。 ...
摘要:集合工具包是在包中,實現了數據結構數組棧鏈表隊列映射和集合。集合主要可以劃分為個部分列表集合映射工具類迭代器枚舉類和。集合的框架圖如下圖片來源集合頂層接口主要有和。和都是集合遍歷相關接口,是特有的遍歷工具接口 Java集合工具包是在java.util.*包中,實現了數據結構:數組、棧、鏈表、隊列、映射和集合。Java集合主要可以劃分為4個部分:List列表、Set集合、Map映射、工具...
摘要:基礎部分集合框架接口接口泛型所有集合類都位于包下。集合框架的知識總結集合框架總結接口的使用集合框架總結類的排序問題聲明常量的兩種方法遍歷的四種方法泛型當我們把一個對象放入集合中后,系統會把所有集合元素都當成類的實例進行處理。 Java 基礎部分——集合框架 Collection 接口 Map 接口 泛型 所有集合類都位于java.util包下。集合中只能保存對象(保存對象的...
摘要:深入高級語法集合框架早在中之前,就提供了特設類。固然這些類都非常有用,但是它們缺少一個中心的,統一的主題。算法是完成匯合接口的對象里的辦法執行的一些有用的計算,例如搜索和排序。雖然不是匯合,但是它們完整整合在匯合中。 download:??深入JavaScript高級語法-coderwhy??Java 集合框架早在 Jav...
閱讀 2079·2021-09-29 09:35
閱讀 676·2021-09-08 09:36
閱讀 3389·2021-09-03 10:30
閱讀 2109·2019-08-30 14:21
閱讀 2905·2019-08-30 11:18
閱讀 3306·2019-08-29 17:31
閱讀 3136·2019-08-29 17:29
閱讀 1300·2019-08-29 17:13