摘要:第三階段常見對象的學(xué)習(xí)集合框架集合在實際需求中,我們常常會遇到這樣的問題,在諸多的數(shù)據(jù)中,通過其編號來尋找某一些信息,從而進行查看或者修改,例如通過學(xué)號查詢學(xué)生信息。面試題和的區(qū)別是單列集合的頂層接口,有子接口和。
第三階段 JAVA常見對象的學(xué)習(xí) 集合框架——Map集合
在實際需求中,我們常常會遇到這樣的問題,在諸多的數(shù)據(jù)中,通過其編號來尋找某一些信息,從而進行查看或者修改,例如通過學(xué)號查詢學(xué)生信息。今天我們所介紹的Map集合就可以很好的幫助我們實現(xiàn)這種需求(一) 概述及功能 (1) 概述
Map是一種存儲元素對的集合(元素對分別稱作 鍵 和 值 也稱鍵值對)它將鍵映射到值的對象。一個映射不能包含重復(fù)的鍵,并且每個鍵最?多只能映射到一個值。
怎么理解呢?鍵 (key):就是你存的值的編號 值 (value):就是你要存放的數(shù)據(jù)
你可以近似的將鍵理解為下標,值依據(jù)鍵而存儲,每個鍵都有其對應(yīng)值。這兩者是1、1對應(yīng)的
但在之前下標是整數(shù),但是Map中鍵可以使任意類型的對象。
Map集合和Collection集合的區(qū)別?
Map集合存儲元素是成對出現(xiàn)的,Map集合的鍵是唯一的,值是可重復(fù)的
Collection集合存儲元素是多帶帶出現(xiàn)的,Collection的子類Set是唯一的,List是可重復(fù)的。
Map集合的數(shù)據(jù)結(jié)構(gòu)值針對鍵有效,跟值無關(guān),Collection集合的數(shù)據(jù)結(jié)構(gòu)是針對元素有效
(2) 功能A:添加功能
//添加元素 V?put(K?key,V?value)??? //如果鍵是第一次存儲,就直接存儲元素,返回null //如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
B:刪除功能
//移除所有的鍵值對元素 void?clear() //根據(jù)鍵刪除鍵值對元素,并把值返回 V?remove(Object?key)
C:判斷功能
//判斷集合是否包含指定的鍵 boolean?containsKey(Object?key) //判斷集合是否包含指定的值 boolean?containsValue(Object?value) //判斷集合是否為空 boolean?isEmpty()
D:獲取功能
//將map集合中的鍵和值映射關(guān)系打包為一個對象 Set>?entrySet() //根據(jù)鍵獲取值 V?get(Object?key) //獲取集合中所有鍵的集合 Set ?keySet() //獲取集合中所有值的集合 Collection ?values()
E:長度功能
//返回集合中的鍵值對的對數(shù) 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及子類總結(jié) 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集合的數(shù)據(jù)結(jié)構(gòu)僅僅針對鍵有效,與值無關(guān)。
存儲的是鍵值對形式的元素,鍵唯一,值可重復(fù)
HashMap底層數(shù)據(jù)結(jié)構(gòu)是哈希表,線程不安全,效率高
哈希表依賴兩個方法:hashCod()和equals()
執(zhí)行順序:
首先判斷hashCode()值是否相同
是:繼續(xù)執(zhí)行equals(),看其返回值
是true:說明元素重復(fù),不添加
是false:就直接添加到集合
否:就直接添加到集合
最終:
自動生成hashCode()和equals()即可
LinkeHashMap底層數(shù)據(jù)結(jié)構(gòu)是由鏈表和哈希表組成
由鏈表保證元素有序
由哈希表保證元素唯一
Hashtable底層數(shù)據(jù)結(jié)構(gòu)是哈希表
哈希表依賴兩個......自動生成hashCode()和equals()即可
TreeMap底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹(是一種自平衡的二叉樹)
如何保證元素唯一性呢?
根據(jù)比較的返回值是否是0來決定
如何保證兩種元素的排序呢?
自然排序(元素具備比較性)
讓元素所屬的類實現(xiàn)comparable接口
比較器排序(集合具備比較性)
讓集合接收一個comparator的實現(xiàn)類對象
可以多層嵌套
HashMap集合嵌套HashMap
HashMap集合嵌套ArrayList
ArrayList集合嵌套HashMap
HashMap
1:Hashtable和HashMap的區(qū)別?
**Hashtable**:線程安全,效率低。不允許null鍵和null值 **HashMap**:線程不安全,效率高。允許null鍵和null值
?
(其實HashMap就是用來替代Hashtable的,就像ArrayList替代vector一樣)
2:List,Set,Map等接口是否都繼承子Map接口?
List,Set不是繼承自Map接口,它們繼承自Collection接口
Map接口本身就是一個頂層接口
需要排序:TreeMap
不需要排序:HashMap
不知道具體需求:HashMap
(四) 經(jīng)典案例(1) 統(tǒng)計字符串中字符出現(xiàn)的次數(shù)
import java.util.Map; import java.util.Scanner; import java.util.Set; import java.util.TreeMap; /* * 案例(統(tǒng)計字符串中字符出現(xiàn)的次數(shù)) * 需求: * 獲取一個字符串出現(xiàn)的次數(shù) * 分析: * A:定義一個字符串(或者鍵盤錄入) * B: 定義一個TreeMap集合 * 鍵:Character * 值:Integer * C:把字符串轉(zhuǎn)換為字符數(shù)組 * D: 遍歷字符數(shù)組,得到每一個字符 * E: 拿剛才得到的字符作為鍵去集合中找,看返回值 * 是 null:說明該鍵不存在,就把該字符串作為鍵,1作為值去存儲 * 不是 null:說明該鍵存在,就把值加 1 然后重寫存儲該鍵和值 * F: 定義字符串緩沖區(qū)變量 * G:遍歷集合,得到該建和值,按照要求拼接 * H:最后把字符串緩沖區(qū)轉(zhuǎn)換為字符串輸出 */ public class CountDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入需要統(tǒng)計的數(shù)據(jù)"); 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); } } //運行結(jié)果 請輸入需要統(tǒng)計的數(shù)據(jù) HelloWorld result: H(1) W(1) d(1) e(1) l(3) o(2) r(1)
(2) 模擬斗地主案例
在講解這個案例之前,我們先來了解一個我們下面案例中所需要知道的知識點
Collections 工具類
Collections:是針對集合進行操作的工具類,都是靜態(tài)方法。
面試題:
Collection和Collections的區(qū)別?
Collection:是單列集合的頂層接口,有子接口List和Set。(Map是雙列的)
Collections:是針對集合操作的工具類,有對集合進行排序和二分查找的方法
Collections的靜態(tài)方法
//排序?默認情況下是自然順序。 public?static??void?sort(List ?list) //二分查找 public?static? ?int?binarySearch(List>?list,T?key) //最大值 public?static? ?T?max(Collection>?coll) //反轉(zhuǎn)(逆序排序) public?static?void?reverse(List>?list) //隨機置換(猶如洗牌,每次運行結(jié)果不一樣) public?static?void?shuffle(List>?list) 如果同時有自然排序和比較器排序,以比較器排序為主(也就是說,當同時實現(xiàn)了Student類的自然排序(implements?Comparable )以及比較器排序的話(new?Comparator ()),比較器排序會覆蓋自然排序)
//斗地主案例代碼 package cn.bwh_03_PokerGame; import java.util.*; public class PokerGame { public static void main(String[] args) { HashMap結(jié)尾: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); //發(fā)牌(發(fā)的是編號,為了保證編號是排序的,使用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集合找對應(yīng)的牌) lookpocker("player1", player1, hm); lookpocker("player2", player2, hm); lookpocker("player3", player3, hm); lookpocker("預(yù)留", handcards, hm); } //看牌功能實現(xiàn) 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(); } }
如果內(nèi)容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關(guān)注我吧?。ㄏ盗形恼戮鶗诠娞柕谝粫r間更新)
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創(chuàng)Java技術(shù)的公眾號:理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75238.html
集合接口 核心集合接口封裝了不同類型的集合,如下圖所示,這些接口允許獨立于其表示的細節(jié)來操縱集合,核心集合接口是Java集合框架的基礎(chǔ),如下圖所示,核心集合接口形成層次結(jié)構(gòu)。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類推,另請注意,層次結(jié)構(gòu)...
摘要:接口下面包含等。但是接口并沒有繼承接口,因此無法迭代。分離出接口是迭代器模式。但是接口又提供了接口以后將轉(zhuǎn)換成集合來迭代。的增強循環(huán)也只適用于那些繼承了接口的。 Iterator接口是Collection接口的父接口。Collection接口下面包含List,Set,Queue等。 Map接口與Collection接口同級。但是Map接口并沒有繼承Iterator接口,因此無法迭代。 ...
摘要:集合工具包是在包中,實現(xiàn)了數(shù)據(jù)結(jié)構(gòu)數(shù)組棧鏈表隊列映射和集合。集合主要可以劃分為個部分列表集合映射工具類迭代器枚舉類和。集合的框架圖如下圖片來源集合頂層接口主要有和。和都是集合遍歷相關(guān)接口,是特有的遍歷工具接口 Java集合工具包是在java.util.*包中,實現(xiàn)了數(shù)據(jù)結(jié)構(gòu):數(shù)組、棧、鏈表、隊列、映射和集合。Java集合主要可以劃分為4個部分:List列表、Set集合、Map映射、工具...
摘要:基礎(chǔ)部分集合框架接口接口泛型所有集合類都位于包下。集合框架的知識總結(jié)集合框架總結(jié)接口的使用集合框架總結(jié)類的排序問題聲明常量的兩種方法遍歷的四種方法泛型當我們把一個對象放入集合中后,系統(tǒng)會把所有集合元素都當成類的實例進行處理。 Java 基礎(chǔ)部分——集合框架 Collection 接口 Map 接口 泛型 所有集合類都位于java.util包下。集合中只能保存對象(保存對象的...
摘要:深入高級語法集合框架早在中之前,就提供了特設(shè)類。固然這些類都非常有用,但是它們?nèi)鄙僖粋€中心的,統(tǒng)一的主題。算法是完成匯合接口的對象里的辦法執(zhí)行的一些有用的計算,例如搜索和排序。雖然不是匯合,但是它們完整整合在匯合中。 download:??深入JavaScript高級語法-coderwhy??Java 集合框架早在 Jav...
閱讀 2091·2021-09-29 09:35
閱讀 695·2021-09-08 09:36
閱讀 3404·2021-09-03 10:30
閱讀 2120·2019-08-30 14:21
閱讀 2920·2019-08-30 11:18
閱讀 3323·2019-08-29 17:31
閱讀 3150·2019-08-29 17:29
閱讀 1318·2019-08-29 17:13