持续总结中!2024年面试必问 100 道 Java基础面试题(三十六)

上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(三十五)-CSDN博客

七十一、hashCode有什么用?

在Java中,hashCode() 方法是 java.lang.Object 类中的一个方法,所有Java对象都继承了这个方法。hashCode() 方法的主要用途和它为什么重要,可以从以下几个方面来理解:

1. 散列(哈希)

hashCode() 方法返回一个int类型的值,这个值是根据对象的内部状态计算出来的,通常称为哈希码。哈希码被用于哈希表(如 HashMapHashtableHashSet)中,这些数据结构使用哈希码来确定对象存储的位置。

2. 快速查找

哈希码的主要目的是快速查找。通过计算对象的哈希码并使用它来索引数据结构,可以非常快速地访问对象,这比线性搜索或树搜索要快得多。

3. 对象相等性

hashCode() 方法与 equals() 方法紧密相关。根据Java的约定,如果两个对象通过 equals() 方法比较是相等的,那么它们的 hashCode() 方法必须返回相同的值。这个约定对于哈希表的一致性和正确性至关重要。

4. 性能优化

使用哈希码可以优化性能,因为它减少了在数据集合中搜索对象所需的时间。如果对象的哈希码分布均匀,那么哈希表的碰撞(两个对象有相同的哈希码)会减少,从而提高查找效率。

5. 不变性

一个好的哈希码实现应该具有不变性,这意味着只要对象的属性没有改变,那么无论何时调用 hashCode() 方法,返回的哈希码都应该是相同的。

示例代码

public class Person {
    private String name;
    private int age;

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

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

    // 其他方法和构造器
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("John", 30);
        Person person2 = new Person("John", 30);
        System.out.println(person1.hashCode()); // 某个基于name和age的哈希码
        System.out.println(person2.hashCode()); // 相同的哈希码,因为对象相等
    }
}

在这个示例中,Person 类重写了 equals()hashCode() 方法。如果两个 Person 对象的 nameage 属性相同,那么它们的 hashCode() 方法将返回相同的值。

注意事项

  • 如果你重写了 equals() 方法,也应该重写 hashCode() 方法,以保持两者的一致性。
  • 哈希码的计算应该基于对象的关键属性,这些属性是用于 equals() 方法比较的属性。
  • 不要假设哈希码是唯一的,不同的对象可能会有相同的哈希码,这种情况称为哈希碰撞。

总结来说,hashCode() 方法在Java中用于支持哈希表操作,它提供了一种快速查找对象的方式,并且与对象的相等性密切相关。正确实现 hashCode() 方法对于确保哈希表的性能和正确性至关重要。

七十二、hashCode和identityHashCode的区别?

在Java中,hashCode()identityHashCode() 是两种不同的哈希码生成方式,它们有以下主要区别:

hashCode()

  1. 定义hashCode()java.lang.Object 的一个方法,所有Java对象都继承了这个方法。它的目的是产生一个代表对象的哈希码,用于哈希表如 HashMapHashSet

  2. 重写:默认情况下,hashCode() 方法是根据对象的内存地址来计算哈希码的。但是,通常建议重写这个方法,以便根据对象的属性(通常是与 equals() 方法比较时使用的属性)来生成哈希码。

  3. 性能hashCode() 的实现通常比较快,因为它可以快速地为对象生成一个哈希码。

  4. 等价性:根据Java的约定,如果两个对象通过 equals() 方法比较是相等的,那么它们的 hashCode() 方法也应该返回相同的值。

identityHashCode()

  1. 定义identityHashCode()java.util.Objects 类的一个静态方法,它返回对象的哈希码,该哈希码是根据对象的内存地址计算的。

  2. 使用identityHashCode() 通常用于那些没有重写 hashCode() 方法的对象,或者在需要一个稳定哈希码,且对象的 equals() 方法不会被重写的情况下。

  3. 性能identityHashCode() 的计算可能比 hashCode() 慢,因为它需要调用本地方法来获取对象的内存地址。

  4. 稳定性identityHashCode() 返回的哈希码在对象的整个生命周期内是稳定的,不会因为对象内容的变化而改变。

示例代码

import java.util.Objects;

public class HashCodeExample {
    public static void main(String[] args) {
        Object obj = new Object();

        // 调用继承自Object的hashCode()方法
        int hashCode = obj.hashCode();
        System.out.println("hashCode: " + hashCode);

        // 调用Objects类的identityHashCode()方法
        int identityHashCode = Objects.identityHashCode(obj);
        System.out.println("identityHashCode: " + identityHashCode);
    }
}

在这个示例中,我们创建了一个 Object 实例,并分别使用 hashCode()identityHashCode() 方法来获取它的哈希码。

注意事项

  • hashCode() 应该根据对象的属性来生成哈希码,而 identityHashCode() 仅基于对象的身份(内存地址)。
  • 在并发环境中,对象的内存地址可能会改变,因此 identityHashCode() 可能不适用。
  • 由于 identityHashCode() 依赖于对象的内存地址,因此它不应该用于长期存储或跨JVM的哈希码比较。

总结来说,hashCode() 是一个可以被重写的方法,通常用于哈希表操作,而 identityHashCode() 提供了一个基于对象内存地址的稳定哈希码,但它的性能可能较低,且依赖于对象的具体实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bugku Crypto 部分题目简单题解

抄错的字符 题目描述: 老师让小明抄写一段话,结果粗心的小明把部分数字抄成了字母,还因为强迫症把所有字母都换成大写。你能帮小明恢复并解开答案吗: QWIHBLGZZXJSXZNVBZW 观察疑似base64解码,尝试使用cyberchef解码…

CentOs9编译C指令报错的一种解决方案

今天使用centos9编译c代码时,显示bash: gcc: command not found... 下图是我的报错页面,依据提示信息安装gcc之后依旧显示失败 找到其中一种解决方式,完美解决,供参考 输入以下指令更新软件包列表,这里需要等待几分…

Springboot 单体thymeleaf极简门户网站

企业门户网站,基于Springboot和layui 1、原介绍 使用技术:后端框架:SpringBoot,Mybatisplus ### 数据库:MySQL,redis ## 前端框架:Layui ## 权限框架:shiro ## 网页模板引擎:thyme…

【MATLAB源码-第205期】基于matlab的LDPC译码算法仿真,对比BF算法,最小和算法,对数BP和概率BP四种算法。

操作环境: MATLAB 2022a 1、算法描述 LDPC 码简介 LDPC码是一种通过稀疏奇偶校验矩阵定义的线性分组码,1962年由Gallager首次提出。这种码具有高效的解码性能,尤其在接近香农极限的情况下,其性能表现尤为突出。LDPC码的核心特…

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65)

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 海量点云的处理,需要提前进行抽稀预处理,相比MATLAB预先给出的抽稀方法,这里提供一种基于规则格网的自定义抽稀方法,步骤清晰,便于理解抽稀内涵, 主要涉及到使…

新火种AI|马斯克聘用OpenAI泄密者,他们的梁子着实越结越深...

作者:小岩 编辑:彩云 就在最近,昔日就职于OpenAI的工程师Pavel Izmailov正式加入了马斯克的AI团队,他还在自己的推特上大张旗鼓的做着宣传:研究院xai。 AI工程师的跳槽本不值得惊讶,但Pavel的跳槽却在行…

VS2019下使用MFC完成科技项目管理系统

背景: (一)实验目的 通过该实验,使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识,熟练应用数据库知识,通过处理过程对计算机软件系统工作原理的进一步理解&…

Linux进程——Linux进程间切换与命令行参数

前言:在上一篇了解完进程状态后,我们简单了解了进程优先级,然后遗留了一点内容,本篇我们就来研究进程间的切换,来理解上篇提到的并发。如果对进程优先级还有没理解的地方可以先阅读: Linux进程优先级 本篇…

【JAVA基础之时间API】自定义时间格式

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.Date类 1.1 概述 1.2 构造方法 1.3 常用方法 2.SimpleDateFormat类 2.1 概述 2.2 构造方法 2.3 格式规则 2.4 常用方法 3.Calendar类 3.1 概述…

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程,从最开始的想法到代码提交的详细记录,有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接:LINK 看题目意思是就是给你一个数X&…

C++贪心算法

关于string的系统函数! (注:以下函数只可用于string,不适用其他类型的变量) ① a.size(); 这个系统函数是用来获取这个string变量的长度的,我们通常会新建一个变量来保存他,以便之后使用。 …

在java类前添加上文档注释

第一步: 第二步 第三步 将下面代码粘上 /** *Author Lnn *Date ${DATE}/${TIME} *ClassName ${NAME} *Description */

ios苹果App上架到应用商店的操作流程

哈喽,大家好呀,淼淼又来和大家见面啦,发现最近有许多想要上架App的小伙伴,但是又不知道要怎么操作,对于开发者而言,将精心打造的iOS应用程序成功上架到苹果的 App Store 是向全球用户展示咱们的产品和服务的…

《动手学深度学习》预备知识和安装环境

哈喽,欢迎来到自学深度学习小白的文章,本文将介绍anacoda是什么和有什么用,以及在win10环境下如何安装运行环境。 关于anaconda 1.环境 准备开始写代码了,教材总是先叫你配好环境,环境可以堪称一栋房子,…

MindSponge分子动力学模拟——软件架构

技术背景 在前面一篇文章中,我们介绍了MindSponge的两种不同的安装与使用方法,让大家能够上手使用。这篇文章主要讲解MindSponge的软件架构,并且协同mindscience仓库讲解一下二者的区别。 整体架构 首先我们来了解一下MindSponge独立仓库的…

Baidu Comate智能编码助手:提升软件生产力的高效工具使用教程

目录 一、前言 二、Comate助手概览 三、核心功能详解 智能推荐与自动补全 生成单元测试 代码注释生成 四、使用场景与优势 五、总结与展望 一、前言 随着信息技术的飞速发展,编程已经成为许多行业不可或缺的一部分。然而,编程过程中的繁琐和重复…

基于51单片机交通灯设计—汇编语言

基于51单片机的交通灯设计 (仿真+程序设计报告) 功能介绍 具体功能: 1.南北方向绿灯20s(最后3s闪烁)后转黄灯常亮5s,同时东西方向红灯25秒;东西方向绿灯20s(最后3s闪烁…

【三】DRF序列化进阶

序列化器的定义与使用 多表关联序列化 【1】准备工作 # settings.py DATABASES {default: {# 数据库引擎选择使用MySQLENGINE: django.db.backends.mysql,# 指定数据库名字,需提前创建NAME: books,# 指定数据库用户名USER: root,# 指定数据库用户密码PASSWORD: …

Redis 主从复制 初步认识

文章目录 定义拓扑拓扑定义单从拓扑多从拓扑树型拓扑 使用原理建立流程持续复制 定义 Redis主从复制技术的主要满足的需求是①数据恢复②负载均衡 ①数据恢复的理解:将数据同步到多个Redis服务器中,其中一个节点数据损毁,可通过复制其他节点…

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候,CPU会轮流使用相同的时间去执行它,即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期(SysTick的中断周期可以修改)。 比如有三个相同优先级的任务在运行…
最新文章