当前位置: 首页 > article >正文

【Java数据结构】Map Set

Java中Map和Set是两个接口,可以利用它们选择任意一个实现类。Map中存储的是key-value的键值(通过key找到value值),Set中存储的是key(快速找出这个key)。

Map

1.关于Map的说明

Map分TreeMap和HashMap,Map在比较是是通过key来比较的,下面是构造方法:

Map<String,Integer> map = new TreeMap<>();
TreeMap<Strinh,Integer> map1 = new TreeMap<>();

2.Map的主要方法

put方法是存储key-value,get方法是得到key对应的value值。Map存储键值时,key一定是唯一的(不能重复),如果重复出现就可以修改value的值。 

public static void main(String[] args) {
    TreeMap<String, Integer> map = new TreeMap<>();
    map.put("This",3);
    map.put("This",5);//相同的key只能出现一次,如果再次出现就会改变value
    int value = map.get("This");
    System.out.println("This对应的value:"+value);
}

如果想要找一个key的value值,但是Map存储中又不存在这个key,那就会报错(空指针异常);但是不想出现空指针异常的话可以使用Map的方法getOrDefault,如果不存在这个key,那就自己设置一个数字用来识别空指针异常的操作(例如:可以使用-1、或者更大的数字10000等)

    int value2 = map.get("a");
    System.out.println(value2);
//getOrDefault方法
    int value1 = map.getOrDefault("a",-1);
    System.out.println(value1);

remove方法是将Map中存储的key删除,并且返回的是该key的value值,再次删除时Map中就不存在这个key,就返回null。

    System.out.println(map.remove("This"));//5
    System.out.println(map.remove("This"));//null   删除成功
    System.out.println(map.remove("a"));//null

keySet方法是保存所有的key的不重复集合,保存的顺序是无序的(不会按照添加的顺序进行排序),如果使用HashSet就有可能按照字典顺序或者升序进行排列。既然有保存所有的key那就也有保存所有的value值,values方法就是保存所有的value值,并且它也是没有顺序而言的。

    map.put("This",3);
    map.put("a",4);
    map.put("one", 29);
    map.put("dog", 7);
    Set<String> set = map.keySet();

    Collection<Integer> values = map.values();

entrySet方法是将map存储的key连成一棵树,每一个结点的类型都是Map.Entry<K,V>,这个方法是保存Map中所有的key和key对应的value值,既然保存下来了,就可以遍历所有的key和value,通过增强for循环来遍历。Map.Entry<K, V>是Map内部实现的用来存放<key, value>键值对映射关系的内部类,它可以获取key(getKey方法)和获取value(getValue方法),也可以设置value值(setValue方法)。

   Set<Map.Entry<String, Integer>> entries = map.entrySet();
    for (Map.Entry<String, Integer> entry:entries){
        System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
        if (entry.getKey().equals("a")){
            Integer value1 = entry.setValue(23);//将“a”对应的value值设置成23
            System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
        }
    }

Map也可以使用迭代器遍历所有数据,如下代码: 

    // 获取 map 的 entry 集合
    Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
    // 使用迭代器遍历 map
    while (iterator.hasNext()) {
        Map.Entry<String, Integer> entry = iterator.next();
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println("Key: " + key + ", Value: " + value);
    }

Map直接输出key以及key对应的value值。

    System.out.println(map);

Set

1.关于Set的说明

Set与Map的主要区别:Set是继承自Collection的接口类,Set中只存储类Key。 

    Set<String> set1 = new HashSet<>();
    Set<String> set = new TreeSet<>();

2.关于Set的主要方法

Set添加元素用add,TreeSet底层逻辑也是Set,和Map的put的用法一样,相同的还有remove删除。以下代码是关于Set中主要方法的使用:

    Set<String> set = new TreeSet<>();
    Set<String> set2 = new TreeSet<>();
    set2.add("a");
    set2.add("d");
        set.add("a");
        set.add("b");
        set.add("c");
        System.out.println(set);
        //set.clear();//清空数据
        //System.out.println(set);
        System.out.println(set.contains("d"));//"d"这个元素是否在set存储的数据中
        System.out.println(set.size());//set中存储的数据个数
        System.out.println(set.isEmpty());//set中的数据是否为空
        Object[] s = set.toArray();//将set中的数据转成数组
        for (int i = 0; i < s.length; i++){
            System.out.println("key:"+s[i]);
        }
        System.out.println(set.containsAll(set2));//set2中所有数据在set中是否都有
        System.out.println(set.addAll(set2));//如果set2中的数据set中都有,那就重复了就返回false;如果添加了新的元素返回true
        System.out.println(set);
//迭代器
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            System.out.println("key:"+it.next());
        }

TreeSet的底层是Map实现的,所以set存储数据时key必须是唯一的。并且在Set中没有方法可以实现Key的修改,只有将原来的删除再插入新的数据。TreeSet中不能插入null,但HashSet可以。


http://www.kler.cn/a/570624.html

相关文章:

  • 【前端】HTML 备忘清单(超级详细!)
  • 《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》
  • 大语言模型学习--本地部署DeepSeek
  • 2025-03-02 学习记录--C/C++-PTA 7-36 复数四则运算
  • 登录服务器后如何找到对应的drupal所在的文件夹
  • 网上花店微信小程序+论文源码调试讲解
  • ICP-通过一组匹配的3D点估计相机运动
  • 数列极限入门习题
  • 从零搭建微服务项目Pro(第1-2章——Quartz实现定时任务模块优化)
  • 《OpenCV》——卷积神经网络人脸检测
  • c++ std::stack、std::queue、std::priority_queue使用笔记
  • 系统讨论Qt的并发编程2——介绍一下Qt并发的一些常用的东西
  • Mac上安装Pycharm
  • 《OpenCV》—— dlib库(性别年龄预测)
  • 2024华为OD机试真题-热点网站统计(C++)-E卷-100分
  • 鸿蒙系统分布式文件概述、访问、拷贝
  • K8S学习之基础六:k8s中pod亲和性
  • 单例模式(线程案例)
  • 使用Java操作Excel
  • R语言基础| 基本图形绘制