最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java數(shù)據(jù)存儲的“雙子星”對決(Map和Set的區(qū)別)

 更新時間:2025年02月25日 10:02:22   作者:?喜歡做夢  
文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實現(xiàn)、方法及應(yīng)用場景,Map用于存儲鍵值對,鍵唯一,值可重復(fù);Set用于存儲唯一元素,無序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧

??一、搜索

??1.概念

搜索:是指在數(shù)據(jù)集合過程中查找特定元素或滿足特定條件元素的過程。如:在一組數(shù)組中查找特定的數(shù)字。常見的搜索有直接遍歷和二分查找.....

直接遍歷和二分查找比較適合靜態(tài)類型的查找,即一般不會對區(qū)間進行插入和刪除操作。

所以當需要動態(tài)查找時,即查找時要進行一些插入和刪除,上述的方法并不適用 。如:在學(xué)生系統(tǒng)中,快速查找學(xué)生的成績、統(tǒng)計單詞出現(xiàn)的次數(shù)、確保用戶名唯一(去重)。

Map和Set是一種專門用來進行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),是一種適合動態(tài)查找的集合容器。

??2.模型

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

  • 1.純key模型:由唯一的鍵(key)組成,沒有與鍵直接關(guān)聯(lián)的特定值(value)。

      特點:重點在于對鍵的管理和操作,常用于判斷某個元素是否存在。

      應(yīng)用場景:數(shù)據(jù)去重,黑名單過濾等......

  • 2.key-value模型:是一種鍵(key)和值(value)進行相關(guān)聯(lián)的數(shù)據(jù)組織形式。每個鍵都對應(yīng)著一個特定的值,通過鍵可以快速查找、更新與之關(guān)聯(lián)的值。如查找在一串字符串中查找,某個單詞在該字符串中出現(xiàn)的次數(shù)。

       特點:鍵是唯一的,用于快速定位和訪問對應(yīng)的值,其值可以是各種類型的數(shù)據(jù)。

       應(yīng)用場景:廣泛應(yīng)用于配置文件、數(shù)據(jù)庫等,比如,以用戶ID為鍵,存儲用戶姓名等為值。

Set只存儲了key,Map存儲的就是key—value的鍵對值。

??二、Map

??1.什么是Map?

Map是接口類,該類沒有繼承Collection,儲存的是<K,V>結(jié)構(gòu)的鍵值對,并且K一定是唯一的,不能重復(fù)。

??2.Map的實例化

Map<K,V>是將鍵(key)與值(value)進行關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu),K代表鍵的類型,V代表值的類型。

Map的實現(xiàn)類主要有HashMap,TreeMap

實例化的實現(xiàn):

 public static void main(String[] args) {
        Map<String,Integer> map1=new HashMap<>();
        Map<String,Integer> map2=new TreeMap<>();
    }

 Map是一個接口,不能直接實例化對象,如果要實例化對象只能通過其實現(xiàn)類TreeMap或者HashMap來實現(xiàn)

??3.Map的常見方法

方法解釋
V put(K key,V value)

設(shè)置key值與value值相關(guān)聯(lián)

V remove(Object key)將key對應(yīng)的映射關(guān)系刪除
V remove(Object key,Object value)只有指定的鍵與指定的值相匹配時才可以刪除
V get(Object key)返回key對應(yīng)的value值
V getOrDefault(Object key,V defalutValue)返回key對應(yīng)的value,key不存在,返回默認值

Set<K> keySet()

返回key中的不重復(fù)集合

Collection<V> values()

返回value的可重復(fù)集合
Set<Map.Entry<K,V>> entrySet()返回所有的key-value的映射關(guān)系
boolean containsKey(Object key)判斷是否包含key
boolean containsValue(Object value)判斷是否包含value

??4.Map方法的使用

public static void main(String[] args) {
        Map<String,Integer> map=new HashMap<>();
        //map:設(shè)置k,v值
        map.put("a",2);
        map.put("c",5);
        map.put("s",21);
        //get:獲取key對應(yīng)的value值
        System.out.println(map.get("a"));//2
        System.out.println(map.get("b"));//不存在key值,其默認值為null
        //getOrDefault:
        //如果map中有key值,返回key對應(yīng)的value1值,否則返回設(shè)置的默認值
        System.out.println(map.getOrDefault("a",1));//2
        System.out.println(map.getOrDefault("b",3));//3
        //remove1:如果key值與指定的值相匹配,刪除;否則,不刪除
        map.remove("a",1);//不匹配不刪除
        System.out.println(map.get("a"));//a對應(yīng)的value還是2
        //remove2:刪除key對應(yīng)的value值
        map.remove("a");
        System.out.println(map.get("a"));//null
        //containsKey:判斷是否包含key
        System.out.println(map.containsKey("c"));//true
        //containsValue:判斷是否包含value值
        System.out.println(map.containsValue(10));//false
        Map<String,Integer> map1=new TreeMap<>();
        map1.put("a",2);
        map1.put("a",3);
        map1.put("b",3);
        map1.put("c",6);
        //Set<K> keySet:返回key中不重復(fù)的集合
        Set<String> keySet=map1.keySet();
        System.out.println(keySet);//[a, b, c]
        //Collection<V> values:返回value中可重復(fù)的集合
        Collection<Integer> value=map1.values();
        System.out.println(value);//[3, 3, 6]
        //Set<K,V>> entrySet:返回key-value所有的映射關(guān)系
        Set<Map.Entry<String,Integer>> entrySet=map1.entrySet();
        System.out.println(entrySet);//[a=3, b=3, c=6]
    }

注意事項:

Map中存放鍵值對的Key是唯一的,value是可重復(fù)的,當put相同的key,不同的value值時,只是將key所對應(yīng)的value值進行替換,以最后存放的value為主; 

public static void main(String[] args) {
    Map<String,Integer> map=new HashMap<>();
    map.put("a",11);
    map.put("a",24);
    map.put("a",15);
    System.out.println(map.get("a"));//15
}

在HashMap中存放的key和value可以都為空,在TreeMap中插入鍵對值時,key不能為空,value可以為空;

HashMap

 public static void main(String[] args) {
        Map<String,Integer> map1=new HashMap<>();
        map1.put("a",null);
        map1.get("a");//無異常
        map1.put(null,null);
        map1.get(null);//無異常
    }

 TreeMap

  public static void main(String[] args) {
        Map<String,Integer> map1=new TreeMap<>();
        map1.put("a",null);
        map1.get("a");//無異常
        map1.put(null,2);
        map1.get(null);//報錯
    }

  • Map中鍵值對的key不能直接修改,可以直接修改value值,如果要修改key,只能將key刪除,在進行重新插入。
  •  HashMap和TreeMap是Map的接口實現(xiàn)類,用于存儲鍵對值數(shù)據(jù),以下是他們的區(qū)別:
Map的底層結(jié)構(gòu)TreeMapHashMap
底層結(jié)構(gòu)紅黑樹哈希表(數(shù)組+鏈表/紅黑樹)
插入/刪除/查找時間復(fù)雜度O(log2N)O(1)
是否有序關(guān)于Key有序無序
允許null鍵不允許,需可比較允許null鍵
線程安全不安全不安全
插入/刪除/查找區(qū)別需要進行元素比較通過哈希函數(shù)計算哈希地址
比較與覆寫key必須能夠比較,否則會拋出異常自定義類型需要覆寫equals和hashCode方法
應(yīng)用場景需要key有序無序有序,需要更高的時間性能

??三、Set

??1.什么是Set?

Set是一個接口,繼承自Collection接口,有HashSet、TreeSet等實現(xiàn)類,HashSet基于哈希表實現(xiàn),不保證元素有序;TreeSet基于紅黑樹實現(xiàn),會對元素進行排序。

??2.Set的常見方法

方法解釋
boolean add(E e)添加元素,但元素重復(fù)不添加
boolean remove(Object o)刪除集合中元素o
boolean contains(Object o)判斷o是否包含在集合中
boolean isEmpty()檢測是否為空,為空返回false,否則返回true
void clear()清空
Iterator<E> iterator()使用迭代器遍歷集合中的對象
int size()返回set中元素個數(shù)
Object[] toArray()將set中的元素轉(zhuǎn)換為數(shù)組返回
boolean containsAll(Collection<?>c)集合中的元素是否在set中的全部存在,是返回true,否則返回false
boolean addAll(Collection<? extend)將集合c中的元素添加到set中,可以達到去重的效果

??3.Set方法的使用

 public static void main(String[] args) {
           public static void main(String[] args) {
        Set<Integer> set1=new HashSet<>();
        //add:添加元素
        set1.add(5);
        set1.add(20);
        set1.add(15);
        set1.add(8);
        //remove:移除元素
        set1.remove(20);
        //是否包含該元素
        System.out.println(set1.contains(5));//true
        System.out.println(set1.contains(2));//false
        //Iterator:遍歷集合
        Iterator<Integer> iterator=set1.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+" ");//5 8 15
        }
        System.out.println();
        //isEmpty:判斷是否為空
        System.out.println(set1.isEmpty());//false:不為空
        //size:計算元素個數(shù)
        System.out.println(set1.size());//3
        //toArray:將set中的元素轉(zhuǎn)換為數(shù)組
        Integer[] toArray=set1.toArray(new Integer[0]);
        for (Integer x:toArray) {
            System.out.print(x+" ");//5 8 15
        }
        System.out.println();
        //containsAll:set是否包含指定集合的所有元素
        Set<Integer> set2=new HashSet<>();
        set2.add(1);
        set2.add(2);
        set2.add(3);
        Set<Integer> set3=new HashSet<>();
        set3.add(1);
        set3.add(2);
        //看set2中是否都包含set3集合中的元素
        boolean containsAll=set2.containsAll(set3);
        System.out.println(containsAll);//true
        //addAll:將集合中的元素添加到set中
        Set<Integer> set4=new TreeSet<>();
        set4.add(1);
        set4.add(5);
        set4.add(19);
        Set<Integer> set5=new TreeSet<>();
        set5.add(2);
        set5.add(1);
        set5.add(6);
        boolean addAll=set4.addAll(set5);
        Iterator<Integer> iterator1=set4.iterator();
        while(iterator1.hasNext()){
            //如果是HashSet那么不自動排序,如果是TreeSet就自動排序
            System.out.print(iterator1.next()+" ");//1 2 5 6 19
        }

注意:

  • Set只存儲了key,并且要求key一定要唯一,其key值不能進行修改,如果要進行修改需要刪除后再插入。
  • Set可以對集合進行去重;
  • TreeSet的底層是使用Map來實現(xiàn)的,其使用key與Object的一個默認對象作為鍵值對插入到Map中;
  • TreeSet和HashSet的區(qū)別
Set底層結(jié)構(gòu)TreeSetHashSet
底層結(jié)構(gòu)紅黑樹哈希表
插入/刪除/查找時間復(fù)雜度O(log2N)O(1)
是否有序key有序不一定有序
允許null鍵不允許,需可比較允許null鍵
線程安全不安全不安全
插入/刪除/查找區(qū)別按照紅黑樹的特性來進行插入和刪除1.先計算key哈希地址2.然后進行插入和刪除
比較與覆寫key必須能夠比較,否則會拋出ClassCastException異常

自定義類型需要覆寫equals和hashCode方法

應(yīng)用場景需要key有序無關(guān)有序,需要更高的時間性能

??四、Map和Set的區(qū)別

區(qū)別MapSet
存儲形式是一種鍵對值(key-value)集合是值的集合,值存在單一的值,不存在重復(fù)元素
訪問方式get(key)方法沒有鍵對值的映射,一般通過for循環(huán)或者迭代器遍歷
唯一性鍵是唯一的,不用重復(fù),值可以重復(fù)所有元素都是唯一的
應(yīng)用場景需要建立映射關(guān)系的場景需要確保元素唯一的場景

到此這篇關(guān)于Java數(shù)據(jù)存儲的“雙子星”對決的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決dubbo錯誤ip及ip亂入問題的方法

    解決dubbo錯誤ip及ip亂入問題的方法

    今天小編就為大家分享一篇關(guān)于解決dubbo錯誤ip及ip亂入問題的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java實現(xiàn)將json數(shù)組轉(zhuǎn)換成對象列表的三種實現(xiàn)方法

    Java實現(xiàn)將json數(shù)組轉(zhuǎn)換成對象列表的三種實現(xiàn)方法

    在Java中,將JSON數(shù)組轉(zhuǎn)換為對象列表通常需要借助第三方JSON處理庫,常用的庫包括 Jackson、Gson 和 Fastjson,以下是各庫的詳細實現(xiàn)步驟,大家可以根據(jù)需要進行選擇
    2025-12-12
  • Spring?Security、oauth2、單點登陸SSO的關(guān)系詳解

    Spring?Security、oauth2、單點登陸SSO的關(guān)系詳解

    這篇文章主要介紹了Spring?Security、oauth2、單點登陸SSO的關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • java的jdbc簡單封裝方法

    java的jdbc簡單封裝方法

    本篇文章是對java的jdbc簡單封裝方法進行了詳細的分析介紹,需要的朋友參考下
    2015-07-07
  • SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池

    SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池

    這篇文章主要介紹了SpringBoot整合Mybatis使用Druid數(shù)據(jù)庫連接池,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 深入理解IOC與DI:Spring容器初始化與依賴注入解析

    深入理解IOC與DI:Spring容器初始化與依賴注入解析

    文章主要介紹了Spring框架中的IOC(控制反轉(zhuǎn))和DI(依賴注入)機制,詳細講述了它們的基本概念、工作原理以及在Spring框架中的應(yīng)用,通過理解IOC和DI,開發(fā)者可以更好地管理對象的創(chuàng)建和依賴關(guān)系,提高系統(tǒng)的靈活性和可維護性,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 手把手教你k8s部署springboot服務(wù)

    手把手教你k8s部署springboot服務(wù)

    本文主要介紹了手把手教你k8s部署springboot服務(wù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼

    Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼

    Thrift是一個軟件框架,用來進行可擴展且跨語言的服務(wù)的開發(fā)。接下來通過本文給大家介紹Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼,需要的朋友參考下吧
    2017-04-04
  • SpringBoot應(yīng)用部署之WAR包部署方式

    SpringBoot應(yīng)用部署之WAR包部署方式

    這篇文章主要介紹了SpringBoot應(yīng)用部署之WAR包部署方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot配置文件格式詳細介紹

    SpringBoot配置文件格式詳細介紹

    這篇文章主要為大家詳細介紹了SpringBoot配置文件格式,文中的示例代碼講解詳細,對我們學(xué)習(xí)SpringBoot有一定幫助,需要的可以參考一下
    2022-09-09

最新評論

青阳县| 资溪县| 隆德县| 五常市| 大英县| 库车县| 乌鲁木齐县| 林西县| 定陶县| 黔西县| 全州县| 永修县| 都兰县| 旌德县| 张家界市| 安庆市| 五家渠市| 额敏县| 新晃| 安顺市| 辽源市| 建宁县| 陈巴尔虎旗| 隆德县| 玛曲县| 大余县| 永胜县| 宣威市| 凤翔县| 延川县| 新平| 高尔夫| 翼城县| 读书| 司法| 红安县| 砚山县| 阿瓦提县| 巴塘县| 望城县| 高平市|