• 【数据结构】Map和Set


    目录

    一、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中键值对是无序的,元素的保存顺序和添加顺序无关。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    clear()清空Map表。

    1. public static void main(String[] args) {
    2. Map namesMap = new LinkedHashMap<>();
    3. namesMap.put("黑旋风","李逵");
    4. namesMap.put("智多星","吴用");
    5. namesMap.put("及时雨","宋江");
    6. namesMap.put("浪子","燕青");
    7. namesMap.put("小乙哥","燕青");
    8. System.out.println(namesMap.remove("黑旋风"));
    9. System.out.println(namesMap.remove("智多星","李逵"));
    10. System.out.println(namesMap.remove("智多星","吴用"));
    11. System.out.println(namesMap);
    12. namesMap.clear();
    13. System.out.println(namesMap);
    14. }

     (4)Map集合的遍历

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

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

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

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

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

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

    1. public static void main(String[] args) {
    2. Map namesMap = new LinkedHashMap<>();
    3. namesMap.put("黑旋风","李逵");
    4. namesMap.put("智多星","吴用");
    5. namesMap.put("及时雨","宋江");
    6. namesMap.put("浪子","燕青");
    7. namesMap.put("小乙哥","燕青"); Set keys = namesMap.keySet();
    8. Collection values = namesMap.values();
    9. System.out.println("Key值为 : ");
    10. for (String s : keys) {
    11. System.out.print(s +" ");
    12. }
    13. System.out.println();
    14. System.out.println("Values为 : ");
    15. for (String s : values) {
    16. System.out.print(s +" ");
    17. }
    18. }

    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上保存。

  • 相关阅读:
    django的csrf跨站请求伪造
    iptables学习
    珠宝饰品经营小程序商城的作用是什么
    数据结构八大排序Java源码
    进程与线程的区别
    股票python量化交易020-双均线策略(上)
    力扣 -- 1049. 最后一块石头的重量 II(01背包问题)
    wps、office插入的复选框无法设置字体及大小?教你一招
    C++:C++11 和 设计模式
    Python调试学习资料
  • 原文地址:https://blog.csdn.net/m0_50987960/article/details/128185676