• HashMap


    1.HashMap集合

    1.1HashMap集合概述和特点【理解】

    • HashMap底层是哈希表结构的
    • 依赖hashCode方法和equals方法保证键的唯一
    • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

    1.2 特点

    1. HashMap是线程不安全的实现;

    2. HashMap可以使用null作为key或value。img

    1.3 JDK7和JDK8中的HashMap有什么区别?


    JDK7中的HashMap,是基于数组+链表来实现的,它的底层维护一个Entry数组。它会根据计算的hashCode将对应的KV键值对存储到该数组中,一旦发生hashCode冲突,那么就会将该KV键值对放到对应的已有元素的后面, 此时便形成了一个链表式的存储结构。

    JDK7中HashMap的实现方案有一个明显的缺点,即当Hash冲突严重时,在桶上形成的链表会变得越来越长,这样在查询时的效率就会越来越低,其时间复杂度为O(N)。

    JDK8中的HashMap,是基于数组+链表+红黑树来实现的,它的底层维护一个Node数组。当链表的存储的数据个数大于等于8的时候,不再采用链表存储,而采用了红黑树存储结构。这么做主要是在查询的时间复杂度上进行优化,链表为O(N),而红黑树一直是O(logN),可以大大的提高查找性能。

    1.4HashMap底层的实现原理

    链表的实现

    hashmap底层实现原理

    2.HashMap集合应用案例【应用】

    • 案例需求

      • 创建一个HashMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并遍历。
      • 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象
    • 代码实现

      学生类

      public class Student {
          private String name;
          private int age;
      
          public Student() {
          }
      
          public Student(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (o == null || getClass() != o.getClass()) return false;
      
              Student student = (Student) o;
      
              if (age != student.age) return false;
              return name != null ? name.equals(student.name) : student.name == null;
          }
      
          @Override
          public int hashCode() {
              int result = name != null ? name.hashCode() : 0;
              result = 31 * result + age;
              return result;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46

      测试类

      public class HashMapDemo {
          public static void main(String[] args) {
              //创建HashMap集合对象
              HashMap<Student, String> hm = new HashMap<Student, String>();
      
              //创建学生对象
              Student s1 = new Student("林青霞", 30);
              Student s2 = new Student("张曼玉", 35);
              Student s3 = new Student("王祖贤", 33);
              Student s4 = new Student("王祖贤", 33);
      
              //把学生添加到集合
              hm.put(s1, "西安");
              hm.put(s2, "武汉");
              hm.put(s3, "郑州");
              hm.put(s4, "北京");
      
              //遍历集合
              Set<Student> keySet = hm.keySet();
              for (Student key : keySet) {
                  String value = hm.get(key);
                  System.out.println(key.getName() + "," + key.getAge() + "," + value);
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25

    Java HashMap 方法

    hashmap

    Java HashMap 常用方法列表如下:

    方法描述
    clear()删除 hashMap 中的所有键/值对
    clone()复制一份 hashMap
    isEmpty()判断 hashMap 是否为空
    size()计算 hashMap 中键/值对的数量
    put()将键/值对添加到 hashMap 中
    putAll()将所有键/值对添加到 hashMap 中
    putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
    remove()删除 hashMap 中指定键 key 的映射关系
    containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
    containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
    replace()替换 hashMap 中是指定的 key 对应的 value。
    replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
    get()获取指定 key 对应对 value
    getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
    forEach()对 hashMap 中的每个映射执行指定的操作。
    entrySet()返回 hashMap 中所有映射项的集合集合视图。
    keySet()返回 hashMap 中所有 key 组成的集合视图。
    values()返回 hashMap 中存在的所有 value 值。
    merge()添加键值对到 hashMap 中
    compute()对 hashMap 中指定 key 的值进行重新计算
    computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
    computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

    asMap 中 |
    | computeIfPresent() | 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。 |

    更多 API 方法可以查看:https://www.runoob.com/manual/jdk11api/java.base/java/util/HashMap.html

  • 相关阅读:
    2023年中国涂料用环氧树脂需求量及行业市场规模前景分析[图]
    【FPGA教程案例75】通信案例1——基于m序列伪码匹配的直接序列扩频解扩通信系统FPGA实现
    JAVA:实现PageRank算法(附完整源码)
    Web之CSS笔记
    C++之STL基础概念、容器、数据结构
    4.HMM和CRF的使用和应用
    Python实现XMind测试用例快速转Excel用例
    工程安全和工程质量
    算法基础——二分检索
    SHA-256 简介及 C# 和 js 实现【加密知多少系列】
  • 原文地址:https://blog.csdn.net/weixin_56462645/article/details/126931261