欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Java中Map和Set接口的使用方法

 更新時(shí)間:2024年08月05日 10:13:15   作者:一只淡水魚66  
Map和set是一種專門用來進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其搜索的效率與其具體的實(shí)例化子類有關(guān),可能在查找時(shí)進(jìn)行一些插入和刪除的操作,即動態(tài)查找,那上述兩種方式就不太適合了,本節(jié)介紹的Map和Set是一種適合動態(tài)查找的集合容器,需要的朋友可以參考下

Map與Set的基本概念與場景

Map和set是一種專門用來進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其搜索的效率與其具體的實(shí)例化子類有關(guān)。以前常見的搜索方式有:

1. 直接遍歷,時(shí)間復(fù)雜度為O(N),元素如果比較多效率會非常慢。
2. 二分查找,時(shí)間復(fù)雜度為O(log2^n),但搜索前必須要求序列是有序的。

上述排序比較適合靜態(tài)類型的查找,即一般不會對區(qū)間進(jìn)行插入和刪除操作了,而現(xiàn)實(shí)中的查找比如:

1. 根據(jù)姓名查詢考試成績
2. 通訊錄,即根據(jù)姓名查詢聯(lián)系方式
3. 不重復(fù)集合,即需要先搜索關(guān)鍵字是否已經(jīng)在集合中

可能在查找時(shí)進(jìn)行一些插入和刪除的操作,即動態(tài)查找,那上述兩種方式就不太適合了,本節(jié)介紹的Map和Set是一種適合動態(tài)查找的集合容器。

模型概念

一般把搜索的數(shù)據(jù)稱為關(guān)鍵字(Key),和關(guān)鍵字對應(yīng)的稱為值(Value),將其稱之為Key-value的鍵值對,所以模型會有兩種:

  1. 純 key 模型,例如:
  • 有一個(gè)英文詞典,快速查找一個(gè)單詞是否在詞典中
  • 快速查找某個(gè)名字在不在通訊錄中
  1. Key-Value 模型,例如:
  • 統(tǒng)計(jì)文件中每個(gè)單詞出現(xiàn)的次數(shù),統(tǒng)計(jì)結(jié)果是每個(gè)單詞都有與其對應(yīng)的次數(shù):<單詞,單詞出現(xiàn)的次數(shù)

Map接口的性質(zhì)

在Java中,Map接口是一個(gè)用于存儲鍵值對(key-value pairs)的對象,它屬于Java Collections Framework的一部分。Map接口的主要特點(diǎn)包括:

  1. 鍵值對存儲Map存儲的數(shù)據(jù)是以鍵值對的形式組織的,每個(gè)鍵(key)唯一對應(yīng)一個(gè)值(value)??梢酝ㄟ^鍵來快速獲取對應(yīng)的值。

  2. 無序性:大多數(shù)實(shí)現(xiàn)類(如HashMap)不會保證元素的順序,除非使用特定的實(shí)現(xiàn)(如LinkedHashMap,它可以保持插入順序,或者TreeMap,它會按照鍵的自然順序或指定的比較器進(jìn)行排序)。

  3. 鍵的唯一性:在同一個(gè)Map中,不能有重復(fù)的鍵。如果試圖將一個(gè)新的值與已有的鍵關(guān)聯(lián),原有的值將被新值替換。

  4. 實(shí)現(xiàn)類:Java提供了多種Map接口的實(shí)現(xiàn),例如:

    • HashMap:基于哈希表的實(shí)現(xiàn),允許null值和null鍵,查找速度快。
    • TreeMap:基于紅黑樹的實(shí)現(xiàn),支持排序的鍵,查找速度相對較慢。
    • LinkedHashMap:結(jié)合了HashMap的哈希表和鏈表特性,維護(hù)插入順序。
  5. 常用方法Map接口提供了一系列的方法,例如:

    • put(K key, V value):將指定的值與指定的鍵關(guān)聯(lián)。
    • get(Object key):返回指定鍵所映射的值。
    • remove(Object key):移除指定鍵的鍵值對。
    • containsKey(Object key):檢查是否存在指定的鍵。
    • keySet():返回Map中所有鍵的集合。
    • values():返回Map中所有值的集合。

總之,Map接口是Java中重要的數(shù)據(jù)結(jié)構(gòu)之一,方便有效地進(jìn)行數(shù)據(jù)的存儲和檢索,廣泛應(yīng)用于各種場景中。

Map接口的使用方法

put(K key, V value):將指定的值與指定的鍵關(guān)聯(lián)。

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
    }
}

get(Object key):返回指定鍵所映射的值。

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        System.out.println(map.get("two"));
    }
}

V getOrDefault(Object key, V defaultValue) :返回 key 對應(yīng)的 value,key 不存在,返回默認(rèn)值

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        System.out.println(map.getOrDefault("five",-1));
    }
}

Set<K> keySet() :返回所有 key 的不重復(fù)集合,用 Set 容器接收

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Set<String> strings = map.keySet();
        
    }
}

Collection<V> values() :返回所有 value 的可重復(fù)集合 ,用 Collection 容器接

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Collection<Integer> values = map.values();
        System.out.println("==");
    }
}

Set<Map.Entry<K, V>> entrySet() :返回所有的 key-value 映射關(guān)系

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            System.out.println("Key = "+entry.getKey()+" Val = "+entry.getValue());
        }
    }
}

注意: 

  1. Map是一個(gè)接口,不能直接實(shí)例化對象,如果要實(shí)例化對象只能實(shí)例化其實(shí)現(xiàn)類TreeMap或者HashMap
  2. Map中存放鍵值對的Key是唯一的,value是可以重復(fù)的
  3. 在TreeMap中插入鍵值對時(shí),key不能為空,否則就會拋NullPointerException異常,value可以為空。但是HashMap的key和value都可以為空。
  4. Map中的Key可以全部分離出來,存儲到Set中來進(jìn)行訪問(因?yàn)镵ey不能重復(fù))。
  5.  Map中的value可以全部分離出來,存儲在Collection的任何一個(gè)子集合中(value可能有重復(fù))。
  6. Map中鍵值對的Key不能直接修改,value可以修改,如果要修改key,只能先將該key刪除掉,然后再來進(jìn)行重新插入。

Set接口的性質(zhì)

在Java中,Set接口是一個(gè)用于存儲唯一元素的集合,它也是Java Collections Framework的一部分。Set接口的主要特點(diǎn)包括:

  1. 唯一性Set中不允許重復(fù)的元素,這意味著集合中的每個(gè)元素都是唯一的。如果試圖添加重復(fù)元素,操作將被拒絕,集合的狀態(tài)不會改變。

  2. 無序性Set通常不保證元素的順序。尤其是使用HashSet時(shí),元素的存儲順序是隨機(jī)的。而LinkedHashSet可以維護(hù)元素的插入順序,TreeSet則會按自然順序或自定義的比較器進(jìn)行排序。

  3. 實(shí)現(xiàn)類:Java提供了多種Set接口的實(shí)現(xiàn),包括:

    • HashSet:基于哈希表的實(shí)現(xiàn),允許null元素,查找速度快,但不保證元素的順序。
    • LinkedHashSet:結(jié)合了哈希表和鏈表的特性,保持元素的插入順序。
    • TreeSet:基于紅黑樹的實(shí)現(xiàn),按升序排序元素,不允許null值。
  4. 常用方法Set接口提供了一系列的方法,例如:

    • add(E e):向集合中添加元素,如果元素已存在,則返回false。
    • remove(Object o):移除指定元素。
    • contains(Object o):檢查集合中是否包含指定元素。
    • size():返回集合中元素的數(shù)量。
    • clear():移除集合中的所有元素。
    • iterator():返回一個(gè)迭代器,用于遍歷集合中的元素。
  5. 應(yīng)用場景Set常用于需要存儲不重復(fù)元素的場景,比如去重、集合運(yùn)算(如交集、并集和差集)等。

總之,Set接口是Java中重要的數(shù)據(jù)結(jié)構(gòu),適合用于處理唯一性要求的數(shù)據(jù)集合,具有高效的存儲和檢索特性。

Set接口的使用方法

set 接口中的方法和 Map 接口中的常見方法大差不差,就不一 一介紹了。

import java.util.TreeSet;
import java.util.Iterator;
import java.util.Set;
public static void TestSet(){
   Set<String> s = new TreeSet<>();
   // add(key): 如果key不存在,則插入,返回ture
   // 如果key存在,返回false
   boolean isIn = s.add("apple");
   s.add("orange");
   s.add("peach");
   s.add("banana");
   System.out.println(s.size());
   System.out.println(s);
isIn = s.add("apple");
   // add(key): key如果是空,拋出空指針異常
   //s.add(null);
   // contains(key): 如果key存在,返回true,否則返回false
   System.out.println(s.contains("apple"));
   System.out.println(s.contains("watermelen"));
   // remove(key): key存在,刪除成功返回true
   //             key不存在,刪除失敗返回false
   //             key為空,拋出空指針異常
   s.remove("apple");
   System.out.println(s);
   s.remove("watermelen");
   System.out.println(s);
   Iterator<String> it = s.iterator();
   while(it.hasNext()){
       System.out.print(it.next() + " ");
  }
   System.out.println();
}

以上就是一文詳解Java中Map和Set接口的使用方法的詳細(xì)內(nèi)容,更多關(guān)于Java Map和Set使用方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java如何基于反射機(jī)制獲取不同的類

    Java如何基于反射機(jī)制獲取不同的類

    這篇文章主要介紹了Java如何基于反射機(jī)制獲取不同的類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java 多用戶登錄限制的實(shí)現(xiàn)方法

    Java 多用戶登錄限制的實(shí)現(xiàn)方法

    最近沒有事情做,閑的發(fā)呆,于是寫個(gè)東東練練手。這篇文章主要介紹了Java 多用戶登錄限制的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java中List集合的常用方法詳解

    Java中List集合的常用方法詳解

    本篇文章給大家?guī)淼膬?nèi)容是關(guān)于Java中List集合的常用方法詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學(xué)習(xí)一下吧
    2021-11-11
  • Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    這篇文章主要為大家詳細(xì)介紹了Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • RabbitMQ簡單隊(duì)列實(shí)例及原理解析

    RabbitMQ簡單隊(duì)列實(shí)例及原理解析

    這篇文章主要介紹了RabbitMQ簡單隊(duì)列實(shí)例及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    這篇文章主要介紹了java static塊和構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握J(rèn)ava static關(guān)鍵字的函數(shù)方法,需要的朋友可以參考下
    2017-09-09
  • springboot如何開啟緩存@EnableCaching(使用redis)

    springboot如何開啟緩存@EnableCaching(使用redis)

    在Spring Boot項(xiàng)目中集成Redis主要包括添加依賴到pom.xml、配置application.yml中的Redis連接參數(shù)、編寫配置類、在啟動類上添加@EnableCaching注解以及測試接口的查詢和緩存驗(yàn)證等步驟,首先,需要在pom.xml中添加spring-boot-starter-data-redis依賴
    2024-11-11
  • netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    這篇文章主要介紹了netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識字的示例代碼

    SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識字的示例代碼

    圖片中的文字提取已經(jīng)越來越多地應(yīng)用于數(shù)據(jù)輸入和自動化處理過程,本文主要介紹了SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識字的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 實(shí)現(xiàn) Java 本地緩存的方法解析

    實(shí)現(xiàn) Java 本地緩存的方法解析

    這篇文章主要介紹了實(shí)現(xiàn) Java 本地緩存的方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評論