• Java中的Map和Set集合


    目录

    Map和Set集合

    Map集合和Set集合的基础使用

    Map的基础使用

    关于Map接口常见子类的添加问题

    Set的基础使用


    Map和Set集合

    主要的数据结构:

    二分搜索树

    在Java标准库中的实现叫 TreeMap / TreeSet

    哈希表

    在Java标准库中的实现叫 HashMap / HashSet

    Map集合和Set集合的基础使用

    Map的基础使用

    Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap。

    Map保存的是键值对元素
    不重复的key对应一个可以重复的value值

    map.put(key,value):添加一个新的键值对。(添加&修改操作)

    若key不存在,就新增一个Map.Entry对象,保存到Map中。没有键映射,则返回NULL。

    若key已经存在,修改原来的value为新的value,返回修改前的value。(既是新增又是修改

    map.containsKey(1) :判断1这个值在当前map的key中是否存在 ——> true

    map.containsValue(100):判断100这个值在map中Value中是否存在 ——> false
    Map集合的遍历:实际上就是取出一对一对的元素,使用for each

    1. for(Map.Entry<k,v> entry : map.entrySet()) {
    2. //每次从Map集合中取出一个键值对对象
    3. entry.getKey();
    4. entry.getValue();
    5. }

    Map中的键值对这个类型——> Map.Entry 表示当前Map中的一个个键值对。
    map.entrySet():返回Map中所有键值对对象,即数组Map.Entry[]。

    1. {
    2. {1:10}, // Map.Entry1
    3. {2:20}, // Map.Entry2
    4. {3:10}, // Map.Entry3
    5. }

    Map.Entry方法
    entry.getKey():当前键值对的key值

    entry.getValue():当前键值对的Value值

    1. package jcl;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. public class MapTest {
    5. public static void main(String[] args) {
    6. Map<Integer, Integer> map = new HashMap<>();
    7. map.put(1, 10);
    8. map.put(2, 10);
    9. map.put(3, 10);
    10. System.out.println(map.containsKey(3));
    11. System.out.println(map.containsValue(40));
    12. //Map.Entry[]
    13. for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    14. System.out.println(entry.getKey() + " = " + entry.getValue());
    15. }
    16. }
    17. }

     


    get():根据相应的key取出相应的value值。若不存在,返回null。

    getOrDefault(key,default):若key不存在,返回默认值defaultVal。

    remove():删除指定key值的这一对健值对,返回删除的value值。

    Set<k> keySet()返回当前Map接口中所有的key值集合。返回值是一个Set集合,key不能重复。Set接口中就保存的不重复元素。

    Collection<V> values()返回当前Map接口中所有的value值集合。返回值是一个Collection接口的集合,value可以重复。

    1. package jcl;
    2. import java.util.*;
    3. /**
    4. * Map集合
    5. */
    6. public class MapTest {
    7. public static void main(String[] args) {
    8. Map<String, String> map = new HashMap<>();
    9. map.put("及时雨", "宋江");
    10. map.put("智多星", "吴用");
    11. map.put("九纹龙", "史进");
    12. map.put("豹子头", "林冲");
    13. System.out.println(map.put("智多星", "张三"));
    14. //取出所有的k值
    15. Set<String> keys = map.keySet();
    16. System.out.println("当前所有的key为:");
    17. for (String str : keys) {
    18. System.out.print(str +" ");
    19. }
    20. System.out.println();
    21. //取出所有的value值
    22. Collection<String> values = map.values();
    23. System.out.println("当前所有的value为:");
    24. for (String str : values) {
    25. System.out.print(str +" ");
    26. }
    27. }
    28. }

    在Map中元素添加的顺序和保存的顺序没有必然联系。

    关于Map接口常见子类的添加问题

    1. Map接口中元素的添加顺序和元素的保存顺序没有必然联系。
    不像List,添加顺序和保存顺序一致。即先添加1,再添加2,则1这个元素一定保存在2之前,逻辑连续。

    1. package jcl;
    2. import java.util.*;
    3. public class MapTest {
    4. public static void main(String[] args) {
    5. Map<String, String> map = new HashMap<>();
    6. map.put("及时雨", "宋江");
    7. map.put("智多星", "吴用");
    8. map.put("九纹龙", "史进");
    9. map.put("豹子头", "林冲");
    10. System.out.println(map.toString());
    11. }
    12. }

    HashMap中保存的元素顺序由hash函数来决定。


    由TreeMap中的compareTo方法决定

    1. package jcl;
    2. import java.util.*;
    3. public class MapTest {
    4. public static void main(String[] args) {
    5. Map<String, String> map = new TreeMap<>();
    6. map.put("及时雨", "宋江");
    7. map.put("智多星", "吴用");
    8. map.put("九纹龙", "史进");
    9. map.put("豹子头", "林冲");
    10. System.out.println(map.toString());
    11. }
    12. }

    要使用TreeMap保存元素,该类必须实现Comparable或传入一个比较器

    HashMap不需要实现比较


    2. 关于保存null值的说明

    HashMap的key和value都能为null,若key为null,有且只有一个。


    TreeMap中key不能为null,value可以为null。

    Set的基础使用

    Set:其实就是披着Set外衣的Map。
    是Collection接口的子接口,一次保存一个元素,和List集合最大的区别在于,Set集合保存的元素不能重复
    Set:元素不重复,使用Set集合来进行去重处理


    boolean add():添加一个元素,若该元素不存在则添加成功,返回true,若该元素已经存在,添加失败,返回false。

    boolean contains():判断一个元素o是否在当前set中存在。

    boolean remove():在Set集合中删除指定元素o,若该元素不存在,删除失败返回false;否则删除该元素,返回true。

    没有提供修改的方法,若需要修改元素,只能先把要修改的元素删除,再添加新元素。

    遍历集合使用for- each循环即可

    1. package jcl;
    2. import java.util.HashSet;
    3. import java.util.Set;
    4. public class SetTest {
    5. public static void main(String[] args) {
    6. Set<Integer> set = new HashSet();
    7. System.out.println(set.add(1));
    8. System.out.println(set.add(1));
    9. System.out.println(set.add(2));
    10. System.out.println(set.add(3));
    11. System.out.println(set.contains(3));
    12. System.out.println(set.contains(4));
    13. System.out.println(set.remove(2));
    14. for (int i : set) {
    15. System.out.print(i + " ");
    16. }
    17. }
    18. }

  • 相关阅读:
    Java并发编程—JUC线程池架构
    update_engine-FilesystemVerifierAction和PostinstallRunnerAction
    设计模式java版本阅读笔记 一结构型
    vue3语法笔记
    cubeIDE开发,基于已有的STM32CubeMX (.ioc)创建工程文件
    Python Playwright 基本使用(步骤详细)
    【涨薪技术】0到1学会性能测试 —— LR录制回放&事务&检查点
    (十)defer关键字
    【SQL】MySQL中的约束
    JVM垃圾回收器介绍
  • 原文地址:https://blog.csdn.net/XHT117/article/details/124851275