数据结构 - Map 和 Set

本文详细介绍了 Java 中的 Map 和 Set 数据结构,包括它们的概念、模型、常用方法和底层实现。Map 用于存储键值对,Set 仅存储唯一元素。文章探讨了哈希表(散列表)的概念、哈希函数的种类、冲突处理和负载因子,并对比了 Tree(如 TreeMap 和 TreeSet)与 Hash(如 HashMap 和 HashSet)的区别。通过示例和解析,阐述了 Map 的 put、get、remove 等方法以及 Set 的主要操作。此外,还讨论了哈希冲突的解决策略,如闭散列和开散列,以及如何通过重写 hashCode 和 equals 方法来处理自定义对象的存储。
摘要由CSDN通过智能技术生成

目录

1.概念

2.模型

3.Map

3.1 Map的常用方法

📢 V put(K key,V value) - 设置 key 对应的 value

📢 V get(Object key) - 返回 key 对应的 value

 ​编辑

📢 V getOrDefault (Object key , V defaultVaule) - 返回 key 对应的 value,如果 key 不存在则返回默认值 (defaultVaule)

 📢 V remova (Object key) - 删除 key 对应的映射关系

 📢 Set keySet() - 返回所有 key 的不重复集合

📢 Collection values() - 返回所有 value 的可重复集合

 📢 boolean containsKey(Object key) - 判断是否包含 key 

📢 boolean containsValue(Object value) - 判断是否包含 value

📢 Set> entrySet() - 返回所有的 key - value 映射关系 

4.set

4.1 Set 的常用方法

 Set (Java Platform SE 8 ) (oracle.com)

 4.2 Set 的底层实现

5. 哈希表(散列表)

5.1 概念

5.2 哈希函数

5.3 哈希函数的种类

💯 直接定址法

💯 除留余数法 - 常用

💯 平方取中法

💯 随机数法

6.冲突

6.1 概念

6.2 负载因子

 6.3 解决 - 闭散列 和 开散列

📢 闭散列

 📢 开散列 - 哈希桶

模拟实现哈希桶

hashCode() 

 7.Tree 和 Hash 的区别


1.概念

Map 和 Set 是一种专门用于搜索查找的数据结构,其搜索的效率与具体实例化的子类有关。

例如本文中主要概述的 TreeMap 和 HashMap ,TreeSet 和 HashSet。

在以往的搜索查找中,我们常使用的方式有:1.直接遍历 O(N) 2.二分查找 O(log₂N) 

这些方式适用于静态查找,何为静态查找呢?

静态查找表:只作查找操作的查找表。

  1. 查询某个“特定”数据元素是否在查找表中。
  2. 检索某个“特定”数据元素和各种属性。

动态查找表:在查找过程同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。 

  1. 查找是插入数据元素。
  2. 查找时删除数据元素。 

现实中的查找例如:

  1.  根据学生姓名查找学生成绩。
  2. 根据姓名查找联系方式。
  3. 根据商品名称查询价格。

在查询的过程中可能会进行插入和删除的操作,而 Map 和 Set 就非常适合动态查找 

 图中可以看出 Set 是实现于 Collection 接口的,而 Map 是没有实现 Collection 接口的。

2.模型

介绍 Map 和 Set 之前需要了解一下什么是模型。

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种 :

 1. 纯 key 模型 :没有对应的值

  • 查找某字典中某个字

2.key - value 模型:有对应的值

  • 查找字典中某个字出现的次数(key == 字,value == 次数) 

key 是唯一的,不可重复,value是可以重复的:

  • 例如网上购物,查询水杯,水杯都是一样的情况下,而价格可能是不一样的。

Map 中存储 key - value,Set 只存储 key。 

3.Map

Map 是一个接口,不能实例化,需要实例化实现他的一个子类,例如TreeMap。

Map 存储的是 Map<K,V>结构的键值对。

3.1 Map的常用方法

此处实例化的是 treeMap 对象,HashMap 在后续 Hash 中会讲到 

📢 V put(K key,V value) - 设置 key 对应的 value

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
        System.out.println(treeMap);
    }

因为 key 是唯一不重复的,如果你设置的key 在 map 中已经存在,那么将会更新同一 key 的 value 

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("猫爪杯子",100);
        System.out.println(treeMap);
    }

 

如果你的 key 是无法进行比较的对象,那么将会抛出异常(ClassCastException - 类强制转换异常)

    static class Cup {//杯子
        String name;
        public Cup(String name) {
            this.name = name;
        }
    }
    public static void main(String[] args) {
        Map<Cup,Integer> treeMap = new TreeMap<>();
        Cup cup1 = new Cup("猫爪杯子");
        Cup cup2 = new Cup("派大星杯子");
        Cup cup3 = new Cup("海绵宝宝杯子");
        treeMap.put(cup1,10);
        treeMap.put(cup2,25);
        treeMap.put(cup3,30);
        System.out.println(treeMap);
    }

key 不能传入 null 值,value 可以传入 null值。key 传入 null 时抛出空指针异常 

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put(null,10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
    }

📢 V get(Object key) - 返回 key 对应的 value

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
        System.out.println(treeMap.get("猫爪杯子"));
    }

 

如果没有找到 key 则返回 null

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
        System.out.println(treeMap.get("杯"));
    }

 

📢 V getOrDefault (Object key , V defaultVaule) - 返回 key 对应的 value,如果 key 不存在则返回默认值 (defaultVaule)

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
        System.out.println(treeMap.getOrDefault("杯子",100));
    }

 

 📢 V remova (Object key) - 删除 key 对应的映射关系

        Map<String,Integer> treeMap = new TreeMap<>();
        treeMap.put("猫爪杯子",10);
        treeMap.put("派大星杯子",25);
        treeMap.put("海绵宝宝杯子",30);
        treeMap.remove("派大星杯子");
        System.out.println(treeMap);

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值