【数据结构】Map和Set
创始人
2024-03-19 03:53:51
0

目录

一、JDK中的Map和Set

1.1Map接口的使用

(1)元素的添加操作

(2)在Map集合中查询特定的值 

(3)删除Map中指定的value和key

 (4)Map集合的遍历

1.2Set集合的应用 


集合java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高校进行读写,无论哪种具体的集合无外乎CURD。

Collection->单个元素保存的父接口。

List->可以保存重复的单个元素。

Set->保存单个不重复元素。

Queue->队列接口,操作受限的线性表。

Deque->双端队列,使用此接口来表示栈或者队列。

一、JDK中的Map和Set

核心的应用场景:高效的搜索。

Set集合只能保存单个元素。集合中所有元素是唯一的不重复的。

Map集合一次保存一个键值对对象(key=vlaue)这样映射对象,用于统计某个元素以及其出现的次数。数学中的映射其实就是Java中的Map集合,存储的都是一个key对应一个value的映射关系。在Map映射关系中,key是唯一的,value的值可以重复。

1.1Map接口的使用

HashMap底层基于哈希表(数组+链表)的实现。

TreeMap底层基于二分搜索平衡树的实现(BeeTree)

(1)元素的添加操作

put(K key, V value): 将键值对key和value保存到当前的Map

在Map集合中,key值不能重复,若put时,发现key重复,则会将当前map中的key对应的value更新为此刻put的value值。value是可以重复的。并且在Map中键值对是无序的,元素的保存顺序和添加顺序无关。

    public static void main(String[] args) {Map namesMap = new HashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("及时雨","燕青");System.out.println(namesMap);}

在HashMap中key和value都可以为null,并且key值只能有一个null。

    public static void main(String[] args) {Map namesMap = new HashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put(null,null);namesMap.put("及时雨",null);namesMap.put(null,"哈哈");System.out.println(namesMap);}

 在TreeMap中key值不能为空,value值可以为空,并且key必须事先Comparable接口或者通过TreeMap的构造方法传入比较器对象,TreeMap的Key值必须是可以比较的。

    public static void main(String[] args) {Map namesMap = new TreeMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨",null);System.out.println(namesMap);namesMap.put(null,null);}

LinkedHashMap:给普通的HashMap加了个链表,这个链表就保存了元素的添加顺序。

    public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨",null);namesMap.put(null,null);System.out.println(namesMap);}

(2)在Map集合中查询特定的值 

get(K key):根据Key值搜索对应的value值,若没有对应的key值则返回null。

getOrDefault(K key,V defaultVal):根据key值搜索map中对应的value值,若没找到,返回默认值defaultValue。

    public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("小乙哥","燕青");System.out.println(namesMap.get("浪子"));System.out.println(namesMap.getOrDefault("及时雨","0"));System.out.println(namesMap.getOrDefault("毛毛雨","0"));}

 boolean contains(K key)在当前Map集合中是否包含指定的key值。

boolean contains(V value)在当前Map集合中是否包含指定的value值。

    public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("小乙哥","燕青");System.out.println(namesMap.containsKey("黑旋风"));System.out.println(namesMap.containsValue("江哥"));}

(3)删除Map中指定的value和key

remove(K key)删除key值对应的键值对对象,返回删除之前的value值。

boolean remove(K key,V value)删除key值对应的value对象,返回布尔值返回是否删除成功。

clear()清空Map表。

    public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("小乙哥","燕青");System.out.println(namesMap.remove("黑旋风"));System.out.println(namesMap.remove("智多星","李逵"));System.out.println(namesMap.remove("智多星","吴用"));System.out.println(namesMap);namesMap.clear();System.out.println(namesMap);}

 (4)Map集合的遍历

Map集合的遍历是比较低效的。

for-each循环只能用于lterable接口以及其子类,Map接口和它毫无关系。

要想进行Map集合的遍历,必须先将Map转为Set集合。

Map接口在存储键值对对象时,内部存储的每一个都是Map.Entry。

    public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("小乙哥","燕青");Set> set = namesMap.entrySet();for(Map.Entry entry: set) {System.out.println(entry.getKey() + "=" + entry.getValue());}}

也可以分别输出key和value,这时重复地value会重复输出。 

   public static void main(String[] args) {Map namesMap = new LinkedHashMap<>();namesMap.put("黑旋风","李逵");namesMap.put("智多星","吴用");namesMap.put("及时雨","宋江");namesMap.put("浪子","燕青");namesMap.put("小乙哥","燕青"); Set keys = namesMap.keySet();Collection values = namesMap.values();System.out.println("Key值为 : ");for (String s : keys) {System.out.print(s +" ");}System.out.println();System.out.println("Values为 : ");for (String s : values) {System.out.print(s +" ");}}

1.2Set集合的应用 

最常用的操作就是去重处理

添加方法add(E e),向当前Set集合中添加一个新的元素e,如果集合中没有该元素则成功添加返回true,若存在,添加失败返回false。

删除方法remove(O o),删除指定元素O。

boolean contains(O o)查询当前Set集合是否包含元素o。

1.3 Set集合和Map集合的关系

Set是保存单个不重复元素的集合,Map是保存一对键值对对象的集合。

Set的常用子类如HashSet,TreeSet内部就使用的是对应的Map对象,HashSet就在HashMap的key上保存,TreeSet就在TreeMap的key上保存。

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...