Java Map 接口案例演示
Map 的介紹
Map 是 Java 中用于存儲鍵值對的集合接口,常見實現(xiàn)包括 HashMap、TreeMap 和 LinkedHashMap。它允許通過鍵快速查找對應的值。
Map 接口實現(xiàn)類的特點【很實用】
注意:這里講的是 JDK8 的 Map接口特點
1)Map 與 Collection 并列存在。用于保存具有映射關系的數(shù)據(jù):Key-Value
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
// 1)Map 與 Collection 并列存在。用于保存具有映射關系的數(shù)據(jù):Key-Value(雙列元素)
Map map = new HashMap();
map.put("no1", "張無忌"); // k-v
map.put("no2","張飛"); // k-v
System.out.println("map = " + map);
}
}2)Map 中的 key 和 values 可以是任何引用類型的數(shù)據(jù),會封裝到 HashMap$Node 對象中,當有相同的 key ,就會替換掉原來的 value
3)Map中的 key 不允許重復,原因和 HashSet 一樣
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1", "張無忌"); // k-v
map.put("no2","張飛"); // k-v
map.put("no1","張三豐");
System.out.println("map = " + map);
}
}4)Map 中的 value 可以重復
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1", "張無忌"); // k-v
map.put("no2","張飛"); // k-v
map.put("no3","張無忌");
System.out.println("map = " + map);
}
}5)Map 的 key 可以為 null,value 也可以為null,注意 key 為null,只能有一個,value 為 null,可以多個
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put(null,null);
map.put(null,"你好");
System.out.println("map = " + map);
}
}6)常用 String 類作為 Map 的 Key (常用的是 String 類,但也可以是其他類型, Object 的子類)
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put(1,"陽光");
map.put(new Object(),"周芷若");
System.out.println("map = " + map);
}
}7)key 和 value 之間存在單向一對關系,即通過 get 方法,指定的 key 總能找到對應的 value
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put(1,"陽光");
map.put(new Object(),"周芷若");
map.put("no1","金毛獅王");
map.put(22.0,"小龍女");
map.put("no2","abcd");
System.out.println("map = " + map);
// 通過 get 方法,傳入 key,返回相應的 value
System.out.println(map.get("no2"));
}
}8)Map 存放數(shù)據(jù)的 key-value 示意圖,一對 k - y是放在一個 HashMap$Node 中的,有因為 Node 實現(xiàn)了 Entry 接口,有些書上也說 一對 k - y 就是一個 Entry(如圖)
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put("first", "賈寶玉");
map.put("Second", "林黛玉");
// 解讀
// 1. k-v 最后是 HashMap$Node node = newNode(hash , key , value , null)
// 2. k-v 為了程序員遍歷,還會創(chuàng)建 EntrySet 集合,該集合存放的元素的類型 Entry ,而一個 Entry
// 對象就有 k-v EntrySet<Entry<k,v>>,即:transient Set<Map.Entry<k,v>> entrySet;
// 3. entrySet 中,定義的類型是 Map.Entry,但是實際上存放的還是HashMap$Node
// 這是因為 static class Node<k,v> implements Map.Entry<k.v>
// 4. 當把 HashMap$Node 對象 存放到 entrySet 就方便我們的遍歷
// k getKey() v getValue()
Set set = map.entrySet();
System.out.println(set.getClass()); // HashMap$Node
for (Object obj : set) {
// System.out.println(obj.getClass());
// 為了從HashMap$Node 中取出 k-v
// 1. 先做一個向下轉(zhuǎn)型
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey() + "-" + entry.getValue());
}
}
}Map接口和常用方法
1)put 添加
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put(null,"書籍");
System.out.println("map = " + map);
}
}2)remove 根據(jù)鍵刪除映射關系
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
map.put(null,"書籍");
System.out.println("map = " + map);
map.remove(null);
System.out.println("使用 remove 方法后的 map = " + map);
}
}3)get 根據(jù)鍵獲取值
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
Object value = map.get("交通工具");
System.out.println(value); //通過 key 得到 value
}
}4)size獲取元素個數(shù)
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
System.out.println(map.size());
}
}5)isEmpty 判斷個數(shù)是否為0
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
System.out.println(map.isEmpty());
}
}6)clear 清除
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
map.clear();
System.out.println("map = " + map);
}
}7)containsKey 查找鍵是否存在
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
System.out.println(map.containsKey("蔬菜")); // 返回 true
}
}Map 遍歷方式案例演示
1)containsKey 查找鍵是否存在
2)keySet 獲取所有的鍵
package com.heima.Hello.Map_;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Map map = new HashMap();
map.put("水果","蘋果");
map.put("蔬菜","西蘭花");
map.put("蔬菜","蘿卜");
map.put("交通工具","地鐵");
map.put("糕點","吐司");
System.out.println("map = " + map);
// 先取出所有的 key,再通過 key 取出對應的 value
Set key_set = map.keySet();
}
}3)entrySet 獲取所有的鍵
4)values 獲取所有的值
HashMap 底層機制及源碼剖析
擴容機制 [ 和 HashSet 相同 ]
1)HashMap 底層維護了 Node 類型的數(shù)據(jù) table,默認為 null
2)當創(chuàng)建對象時,將加載因子(loadfactor)初始化為 0.75
3)當添加 key-val 時,通過 key 的哈希值得到在 table 的索引。然后判斷該索引是否有元素,如果沒有元素直接添加。如果該索引處有元素,繼續(xù)判斷該元素的 key 和準備加入的 key 是否相等,如果相等,則直接替換 val ;如果不相等需要判斷是樹結(jié)構還是鏈表結(jié)構,做出相應處理。如果添加時發(fā)現(xiàn)容量不夠,則需要擴容。
4)第一次添加,則需要擴容 table 容量為 16,臨界值(threshold)為 12(16*0.75)
5)以后再擴容,則需要擴容 table 容量為原來的 2 倍(32),臨界值為原來的 2 倍,即 24,依次類推。
6)在 Java 8 中,如果一條鏈表的元素個數(shù)超過 TREEIFY_THRESHOLD(默認是 8),并且 table 的大小 >= MIN_TREEIFY_CAPACITY(默認64),就會進行樹化(紅黑樹)
總結(jié)—開發(fā)中如何中如何選擇集合實現(xiàn)類(記?。?/h2>
在開發(fā)中,選擇什么集合實現(xiàn)類,主要取決于業(yè)務操作特點,然后根據(jù)集合實現(xiàn)類特性進行選擇,分析如下:
1)先判斷存儲的類型(一組對象[單列]或一組鍵值對 [雙列] )
2)一組對象:Collection 接口
允許重復 :List
增刪多:LinkedList [ 底層維護了一個雙向鏈表 ]
改查多:ArrayList [ 底層維護 Object 類型的可變數(shù)組 ]
不允許重復:Set
無序:HashSet [ 底層是 HashMap,維護了一個哈希表,即(數(shù)組 + 鏈表 + 紅黑樹)]
排序:TreeSet
package com.heima.Hello.Map_;
import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings({"all"})
public class TreeSet_ {
public static void main(String[] args) {
// 解讀
//1. 當我們使用無參構造器,創(chuàng)建 TreeSet 時,仍然是無序的
//2. 希望添加的元素,按照字符串大小來排序
//3. 使用 TreeSet 提供一個構造器,可以傳入一個比較器(原名內(nèi)部類)
// 并指定排序規(guī)則
//4. 簡單看看源碼
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// 下面這句話是調(diào)用 String 類的 compare方法進行字符串比較
return ((String) o1).compareTo((String) o2);
}
});
treeSet.add("a");
treeSet.add("tree");
treeSet.add("hello");
treeSet.add("world");
System.out.println("treeset: " + treeSet);
}
}插入和取出順序一致:LinkedHashSet。維護數(shù)組 + 雙向鏈表
3)一組鍵值對:Map
鍵無序:HashMap [底層是:哈希表 jdk 7:數(shù)組 + 鏈表,jdk 8:數(shù)組 + 鏈表 + 紅黑樹]
鍵排序:TreeMap
鍵插入和取出順序一致:LinkedHashMap
讀取文件 Properties
到此這篇關于Java Map 接口案例演示的文章就介紹到這了,更多相關Java Map 接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中?springcloud.openfeign應用案例解析
使用OpenFeign能讓編寫Web?Service客戶端更加簡單,使用時只需定義服務接口,然后在上面添加注解,OpenFeign也支持可拔插式的編碼和解碼器,這篇文章主要介紹了Java中?springcloud.openfeign應用案例解析,需要的朋友可以參考下2024-06-06
Spring Cloud Consul實現(xiàn)選舉機制的代碼工程
Spring Cloud Consul 是 Spring Cloud 提供的對 HashiCorp Consul 的支持,它是一種基于服務網(wǎng)格的工具,用于實現(xiàn)服務注冊、發(fā)現(xiàn)、配置管理和健康檢查,本文給大家介紹了如何用Spring Cloud Consul實現(xiàn)選舉機制,需要的朋友可以參考下2024-11-11
springmvc+mybatis 做分頁sql 語句實例代碼
本文通過一段實例代碼給大家介紹了springmvc+mybatis 做分頁sql 語句的方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-07-07
java 實現(xiàn)隨機數(shù)組輸出及求和實例詳解
這篇文章主要介紹了java 實現(xiàn)隨機數(shù)組輸出及求和實例詳解的相關資料,需要的朋友可以參考下2016-11-11
Java中數(shù)組array和列表list相互轉(zhuǎn)換
這篇文章主要介紹了Java中數(shù)組array和列表list相互轉(zhuǎn)換,在Java中,可以將數(shù)組(array)和列表(list)相互轉(zhuǎn)換,但需要注意一些細節(jié)和限制,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09
SpringBoot集成Shiro+JWT(Hutool)完整代碼示例
Apache Shiro是一個強大且易用的Java 安全框架,提供了認證、授權、加密和會話管理功能,在現(xiàn)代應用開發(fā)中,Shiro 因其簡單性和靈活性而被廣泛采用,下面通過本文給大家介紹SpringBoot集成Shiro+JWT(Hutool)完整代碼示例,感興趣的朋友跟隨小編一起看看吧2025-08-08

