多列集合---Map

发布于:2025-08-15 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

前言:

一、Map

1.1 特点

1.2 方法

1.3 实现类

二、实现类

2.1 HashMap

2.2 TreeSet

2.3 LinkedHashMap

三、集合的工具类

1.1 Collections

三、总结


前言:

本篇文章重点讨论多列集合(Map),以及多列集合用到的集合工具类。

感谢大家的观看。

什么是Map?

作为多列集合,它和单列集合Set有什么相同点和区别?

Map---用于存储键值对(key--value)

如大家所见,它可以存储一对元素。

那么一对元素有什么用呢?

首先,让我们回顾单列集合的知识,同时思考一个问题。

如果我要买菜,我应该如何让菜和价格联系起来?

在单列集合中,我们只能创建一个自定义类,将菜和价格强行放在一个类中,最后通过我们的单列集合展现出来。

这样固然可以,可是,如果我想要搜索菜就带出它的价格呢?

在单列集合中,菜和价格被固化成了一个整体,我们无法通过搜索菜而寻找它对应的价格。

或者说,不存在只知道菜不知道价格的情况。

这样的局限却往往是我们生活中最常见的。

所以,映射 键值对(key---value)便应运而生。

大家都学过映射吧!

就像这样的一个东西。

Map集合左边的key(键)是唯一的,一个键值只能对应一个值;

Map集合右边的value(值)是可以相同的,不同的键可以关联相同的值。

ok,在对Map集合有了一个简单的了解后,让我们正式开始这篇Map之旅。

一、Map

---存储键值对(key--value)

1.1 特点

存储元素:必须以键值对(key--value)的方式进行;

        --键key-----唯一--------一键一值;

        --值value--可重复-----不同键可以关联相同值

查找;高效---通过唯一的key可以快速查找到对应的value

1.2 方法

size();

put(K key,V value);----给指定的key赋value值

putAll();

containsKey();

containsValue();

keySet();----返回集合中所有的key值

1.3 实现类

---核心区别:排序方式--线性安全

Map有三种实现类:

--HashMap

--TreeMap

--LinkedHashMap

二、实现类

我们已经了解到Map有三种实现类,它们和Set的实现类长的十分相似。

接下来我将会用HashMap着重讨论方法,TreeMap来进行实战练习。

2.1 HashMap

特点;

--底层Hash表-->存储顺序不保证一致

--key唯一------->自定义类要重写hashCode()和equals()方法

--线程不安全

--Null?--->查询没有键值对应的value值为null--->key可以为null,但也只能唯一

代码演示:

public class Test {
    public static void main(String[] args) {
        //创建一个HashMap集合
        Map<Integer,String> map=new HashMap<>();
        //添加元素---给指定的key赋value值
        map.put(0, "hello");
        map.put(1, "hello");
        map.put(0, "hello1");//hello1会将hello覆盖----键Key值唯一的体现
        System.out.println(map.size());
        System.out.println(map);
        //使用map.put时,需要先判断
       
        int key=0;
        if(!map.containsKey(key)){
            map.put(key, "newValue");
        }

        //通过key查询value
        System.out.println("0:"+map.get(0));
        System.out.println("1:"+map.get(1));
        System.out.println("2:"+map.get(2));//没有---null

        //删除
        map.remove(0);
        System.out.println(map.remove(1));//返回被删除的值---hello
        System.out.println(map.remove(2));//null


        //-----------------------------
        map.put(0, "123");
        map.put(1, "456");
        map.put(2, "789");

        //------------------------------

        //遍历 方法1
        Set<Integer> set=map.keySet();
        System.out.println(set);
        for(Integer i:set){
            System.out.println(map.get(i));
        }

        //遍历 方法2
        Collection<String> coll=map.values();
        for(String s:coll){
            System.out.println(s);
        }

        //遍历 方法3---entrySet--返回Set对象:Set<Map.Entry<K,V>>,内部包含了集合中所有的键值对---包含:多个Entry类型的对象
        //Set<Map.Entry<K,V>> entrySet;
        Set<Map.Entry<Integer,String>> entries=map.entrySet();
        System.out.println(entries);
        for(Entry<Integer,String>entry:entries){
            System.out.println(entry.getKey());
            System.out.print("---"+entry.getValue());
            System.out.println();
            //遍历的时候可以修改值
            entry.setValue("456");
            
        }
       
    }

}

2.2 TreeSet

特点:

底层---红黑树;

实现接口--->SortedMap接口--->元素顺序自动排序

线程不安全--->可以通过其他方式解决线程安全问题

接下来,让我们通过一道题来简单的看一看TreeSet。

就像我们刚开始将的一样,多列集合的出现就是为了解决这样的问题。

key--->value

public class Test {
    public static void main(String[] args) {
        Map<String,Double> tree=new TreeMap<>();
        tree.put("香蕉", 5.6);
        tree.put("樱桃", 25.0);
        tree.put("桃子", 5.6);
        tree.put("苹果", 2.3);
        //(1)遍历该map集合,并且统计有多少种⽔果(key),⽤两种⽅式进⾏遍历 
        //key值唯一,所以统计水果数量只需要加一个计数器。
        int num1=0;
        //遍历一:
        Set<String> set=tree.keySet();
        for(String str:set){
            System.out.print(str+"="+tree.get(str)+"  ");
            num1++;
        }
        System.out.println();
        System.out.println("水果数量:"+num1);
        //遍历二:
        //key值唯一,所以统计水果数量等同于长度
        Set<Map.Entry<String,Double>> entries=tree.entrySet();
         for(java.util.Map.Entry<String, Double> entry:entries){
            System.out.print(entry.getKey()+"="+entry.getValue()+"  ");
            num1++;
        }
        System.out.println();
        System.out.println("水果数量:"+tree.size());

        //(2)将“⾹蕉”的价格修改为10.9,并删除桃⼦这组数据,
        //修改,用put更新
        tree.put("香蕉", 10.9);
        //删除
        tree.remove("桃子");

        //(3)将修改后的map中所有key和value都输出到控制台
        //遍历
        Set<String> set1=tree.keySet();
        for(String str:set1){
            System.out.print(str+"="+tree.get(str)+"  ");
        }
    }
}

2.3 LinkedHashMap

---HashMap的子类----多了链表

特点:通过链表记录插入顺序,(存取顺序一致)

三、集合的工具类

---帮助我们操作集合对象,全是静态方法

与此相同的还有常用的数组工具类----Arrays

---同样:帮助我们操作数组,全是静态方法

1.1 Collections

---私有构造方法--不能实例化对象--没有继承,没有实现--父类提供静态方法供外部访问。

注意:

        Collections------集合的工具类

        Collection-------单列集合的根接口

功能:

---填充,排序,翻转等

     fill---填充---使用指定元素替换指定列表中的所有元素

     max----返回最大值---单参(自然)--双参(比较器)

     min----返回最小值---单参(自然)--双参(比较器)

     reverse()---返转集合中的元素

     sort()------自然排序

     shuffle()---列表置换

     addAll(list,1,3,5,7)---添加

三、总结

在面对不同的难题时,我们要如何选择Map实现类?

集合类型 核心场景 排序方式
HashMap 一般键值对存储(无序、高效) 无序
TreeMap 需要按 key 排序的场景(如排行榜) 自然排序 / 比较器排序
LinkedHashMap 需要保留插入顺序的场景(如日志) 插入顺序

关于集合的讨论:

集合学起来并不算困难,某种意义上说,它也只是一种存储方式罢了,同数组的学习难度差不多,我们需要的是多动手,多练习。

毕竟越简单的东西越高深。

我在这里留下一道题,明天将会在对集合进行讨论时着重讨论这道题,大家可以练习一下。

问题一:

好啦!今天就到这里。


网站公告

今日签到

点亮在社区的每一天
去签到