Java 中HashCode作用_动力节点Java学院整理

Java 中HashCode作用

概述

hashCode() 是 Java 中在 Object 类下的一个方法,其主要目的是返回对象的哈希码。哈希码可以看做是一个对象的特征码,不同的对象拥有不同的哈希码,哈希码值是根据对象内容计算而得的 32 位整数。

在 Java 中,哈希码在很多场合都有很重要的作用,例如:

  • HashMap、HashSet、Hashtable、WeakHashMap、IdentityHashMap 等数据结构都使用哈希码来确定对象在集合内的位置;
  • 当一个对象要被序列化成字节序列时,先计算出对象的哈希码,然后将其写入输出流;
  • 当一个对象被作为参数传递给具有 hashCode 参数的算法时,算法可以根据哈希码来优化计算;
  • 等等。

在实际编程中,我们有时需要重写对象的 hashCode() 方法,这是因为对于不同的类需要不同的哈希码策略。在接下来的段落中,我们将通过示例来说明哈希码的应用和编写过程。

示例1:使用哈希码定位对象

HashMap 是 Java 中最常使用的 Map 结构,其内部实现是一个键值对列表,查询的时候使用键的哈希值和散列函数来快速定位对象。下面我们将演示存储自定义对象时,必须重写该对象的 hashCode() 方法,否则在 HashMap 内检索该对象将会失败。

public class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student student = (Student) obj;
        return id == student.id && Objects.equals(name, student.name);
    }
}

public class Main {
    public static void main(String[] args) {
        Map<Student, String> map = new HashMap<>();
        map.put(new Student(1, "Tom"), "A");
        map.put(new Student(2, "Mary"), "B");
        map.put(new Student(3, "Mathew"), "C");
        System.out.println(map.get(new Student(1, "Tom"))); // 正常输出:A
        System.out.println(map.get(new Student(3, "Mathew"))); // 正常输出:C
        System.out.println(map.get(new Student(1, "Jerry"))); // 失败输出:null
    }
}

可以看到,由于哈希码被正确地重写了,我们可以成功地定位到 Map 内存储的元素,而在没有重写哈希码的情况下,虽然对象的内容相同,但是由于哈希码不同,因此会被判断为不同的对象,查询结果自然也会失败。

示例2:使用哈希码序列化和反序列化对象

使用哈希码可以方便地序列化和反序列化对象,下面我们将演示自定义类的哈希码实现以及使用哈希码序列化和反序列化对象。

public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student student = (Student) obj;
        return id == student.id && Objects.equals(name, student.name);
    }
}

public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Student student = new Student(1, "Tom");
        System.out.println(student.hashCode()); // 正常输出:88431941

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(student);
        oos.flush();
        byte[] bytes = baos.toByteArray();
        oos.close();
        baos.close();

        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        Student s2 = (Student) ois.readObject();
        ois.close();
        bais.close();

        System.out.println(s2.hashCode()); // 正常输出:88431941
        System.out.println(s2.equals(student)); // 正常输出:true
    }
}

可以看到,我们通过实现自定义的 hashCode() 方法,可以成功地序列化和反序列化对象,这是因为哈希码作为一个对象的重要特征,其内容被写入到字节序列中,成功地标识该对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 中HashCode作用_动力节点Java学院整理 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • sourcetree提交代码到远程仓库的方法

    以下是“Sourcetree提交代码到远程仓库的方法”的完整攻略: 1. Sourcetree概述 Sourcetree是一款免费的Git和Mercurial客户端,可帮助开发者更轻地管理和代码。它提供了一个直观的用户界面,使得Git和Mercurial的操作更加简单懂。 2. Sourcetree提交代码到远程仓库的方法 在使用Sourcetree提交代码…

    other 2023年5月8日
    00
  • mysql启动服务时提示’服务名无效’

    mysql启动服务时提示”服务名无效” 如果你在Windows上安装了MySQL数据库,并试图使用服务管理器启动MySQL服务时,可能会遇到一个常见的错误: “服务名无效”。这种情况通常发生在你尝试重新安装或更新MySQL时。 原因 这个问题通常是由于MySQL服务的重命名或删除导致的。如果以前已经安装了MySQL,然后你重新安装MySQL时更改了服务名称,…

    其他 2023年3月29日
    00
  • dedecms增加自定义文件名功能

    下面是“dedecms增加自定义文件名功能”的完整攻略,步骤如下: 步骤一:备份原有文件 在修改dedecms之前,请务必备份原有文件,以防数据丢失或系统出现异常。可以使用FTP软件将dedecms文件夹拷贝到其它地方或者直接使用主机软件进行备份。 步骤二:打开文章模板 在DedeCMS的后台管理中,找到“内容模型”->“文章模型”,点击“修改模板”,…

    other 2023年6月25日
    00
  • ios是什么意思?

    iOS,全称为iPhone Operating System,是由苹果公司开发的移动操作系统,运行在iPhone、iPad、iPod Touch等设备上,是目前全球最流行的操作系统之一。 iOS的特点包括易用性、流畅性和安全性。与其他操作系统相比,iOS系统使用起来更加简单,不需要太多的学习成本。同时,iOS的界面流畅度也很高,用户在使用过程中很少会遇到卡顿…

    其他 2023年4月16日
    00
  • Mybatis resultMap标签继承、复用、嵌套方式

    MyBatis resultMap标签继承、复用、嵌套方式攻略 MyBatis是一个流行的Java持久化框架,它提供了许多强大的功能来简化数据库操作。其中,resultMap标签是一个重要的元素,用于将查询结果映射到Java对象。在本攻略中,我们将详细讲解MyBatis resultMap标签的继承、复用和嵌套方式。 继承方式 使用继承方式可以减少重复的代码…

    other 2023年7月28日
    00
  • Android图片异步加载框架Android-Universal-Image-Loader

    Android图片异步加载框架Android-Universal-Image-Loader攻略 简介 Android-Universal-Image-Loader是一个强大的异步图片加载框架,它可以帮助开发者在Android应用中高效地加载和显示图片。该框架提供了许多功能和选项,使得图片加载变得简单而灵活。 安装 要使用Android-Universal-I…

    other 2023年9月6日
    00
  • jquery插件lazyload.js延迟加载图片的使用方法

    下面是详细的jQuery插件lazyload.js延迟加载图片的使用方法攻略。 简介 lazyload.js是一款轻量级的jQuery插件,可以帮助网站实现图片的延迟加载,减少网站的加载时间。该插件使用非常简单,只需引入js文件并初始化即可。 安装 使用lazyload.js需要在HTML页面中引入jQuery库和lazyload.js文件,具体代码如下: …

    other 2023年6月25日
    00
  • 浅谈PostgreSQL的客户端认证pg_hba.conf

    Pg_hba.conf文件是PostgreSQL数据库服务器配置中的一份非常关键的文件。它决定了客户端如何才能连接上PostgreSQL服务器,同时也控制了各种用户的访问权限。在本文中,我们将会深入浅出地介绍pg_hba.conf文件的相关知识。 什么是pg_hba.conf pg_hba.conf(Host-based Authentication)是一份…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部