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

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

七十三、什么是hash冲突?

在计算机科学中,特别是在数据结构和算法领域,哈希冲突(Hash Collision)是指在使用哈希(Hash)函数将数据映射到哈希表(Hash Table)时,不同的输入数据经过哈希函数计算后得到了相同的哈希值(即索引值)。由于哈希表的大小是有限的,而可能的输入数据是无限的,因此哈希冲突在实际应用中是不可避免的。

哈希冲突的原因

  1. 有限的哈希表大小:哈希表通常由数组实现,其大小是固定的,而数据的输入可以是无限的,因此不同的数据项可能映射到同一个哈希表位置。

  2. 不均匀的哈希值分布:理想情况下,哈希函数应该将输入数据均匀地分布在哈希表的所有位置。然而,由于输入数据的特定特征或哈希函数的局限性,有时哈希值可能不会均匀分布,导致某些位置冲突较多。

哈希冲突的解决策略

  1. 链地址法(Chaining):在链地址法中,哈希表的每个位置(或称为“桶”)都关联一个链表。当发生冲突时,新的数据项被添加到对应位置的链表中。

  2. 开放寻址法(Open Addressing):开放寻址法中,当发生冲突时,会根据某种探测策略在哈希表中寻找下一个空闲位置。常见的探测方法包括线性探测、二次探测和双重散列。

  3. 双重哈希(Double Hashing):使用两个哈希函数来计算哈希值,当第一个哈希函数发生冲突时,使用第二个哈希函数计算下一个可能的位置。

  4. 哈希表扩容:当哈希表的负载因子(已使用的桶数量与总桶数量的比值)超过某个阈值时,可以通过增加哈希表的大小来减少冲突。

示例代码

以下是使用链地址法解决哈希冲突的简单示例:

import java.util.LinkedList;
import java.util.List;class HashTable {private List<List<String>> table;public HashTable(int size) {table = new LinkedList<>();for (int i = 0; i < size; i++) {table.add(new LinkedList<>());}}public void insert(String key, String value) {int index = hashFunction(key);table.get(index).add(value);}private int hashFunction(String key) {return key.hashCode() % table.size();}// 其他方法...
}public class HashCollisionExample {public static void main(String[] args) {HashTable hashTable = new HashTable(10); // 创建一个大小为10的哈希表hashTable.insert("apple", "fruit");hashTable.insert("banana", "fruit");// "apple" 和 "banana" 可能发生冲突,被存储在同一个链表中}
}

在这个示例中,我们创建了一个简单的哈希表,它使用链地址法来解决哈希冲突。当插入两个键时,如果它们的哈希值相同,它们将被存储在同一个链表中。

注意事项

  • 哈希冲突是不可避免的,但可以通过合理的哈希函数设计和冲突解决策略来最小化。
  • 哈希表的性能在很大程度上取决于哈希函数的质量和冲突解决策略的有效性。
  • 在设计哈希表时,需要考虑负载因子和哈希表的扩容策略,以保持良好的性能。

总结来说,哈希冲突是哈希表操作中的一个常见问题,它发生在不同数据项映射到同一个哈希表位置时。通过使用不同的冲突解决策略,可以有效地管理冲突,从而维护哈希表的高效性能。

七十四、equals和hashCode的区别和联系?

在Java中,equals() 方法和 hashCode() 方法是对象比较和哈希表使用中非常重要的两个方法。它们之间既有区别也有联系:

equals() 方法

  1. 目的equals() 方法用于比较两个对象是否相等。它的默认实现在 java.lang.Object 中比较的是对象的内存地址,但通常需要根据对象的属性进行重写。

  2. 重写:当类的对象用于集合(如 HashSetHashMap)或进行对象比较时,应该重写 equals() 方法,以确保比较逻辑符合预期。

  3. 一致性equals() 方法的实现必须满足以下条件:

    • 自反性:对于任何非空引用 xx.equals(x) 应返回 true
    • 对称性:对于任何非空引用 x 和 yx.equals(y) 应等于 y.equals(x)
    • 传递性:对于任何非空引用 xy 和 z,如果 x.equals(y) 返回 true,且 y.equals(z) 返回 true,则 x.equals(z) 也应返回 true
    • 一致性:对于任何非空引用 x 和 y,如果对象的内容没有被修改,多次调用 x.equals(y) 应一致地返回 true 或 false
    • 对于任何非空引用 xx.equals(null) 应返回 false

hashCode() 方法

  1. 目的hashCode() 方法返回一个 int 类型的哈希码值,用于哈希表的索引。它根据对象的内部状态生成一个数值,这个数值在对象的生命周期内应保持一致。

  2. 重写:当重写了 equals() 方法时,通常也应该重写 hashCode() 方法,以维护 equals()hashCode() 之间的一致性。

  3. 散列冲突:不同的对象可能产生相同的哈希码,这种现象称为散列冲突。一个好的哈希函数会尽量减少这种冲突。

联系

  • 相等性与哈希码:根据Java的约定,如果两个对象通过 equals() 方法比较是相等的,那么它们的 hashCode() 方法也应该返回相同的值。这样可以确保使用 hashCode() 方法的集合(如 HashMapHashSet)能够正常工作。

  • 性能hashCode() 方法常用于哈希表中快速定位对象。如果对象的 equals() 方法相等,但 hashCode() 方法不相等,那么在哈希表中搜索对象时可能会影响性能。

示例代码

import java.util.Objects;public class MyObject {private int id;private String name;public MyObject(int id, String name) {this.id = id;this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;MyObject myObject = (MyObject) o;return id == myObject.id &&Objects.equals(name, myObject.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}
}

在这个示例中,MyObject 类重写了 equals() 方法和 hashCode() 方法。equals() 方法比较对象的 idname 属性,而 hashCode() 方法根据这些属性生成哈希码。

注意事项

  • 仅仅重写 equals() 方法而忽略 hashCode() 方法是不正确的,这可能导致哈希表操作出现问题。
  • 哈希码的计算应该基于对象的关键属性,这些属性是用于 equals() 方法比较的属性。
  • 在并发环境中,如果对象的属性可能会变化,那么 hashCode() 的值也应该相应地变化,以避免哈希表中的键失效。

总结来说,equals() 方法用于比较对象的相等性,而 hashCode() 方法用于生成哈希码,它们之间有紧密的联系。正确实现这两个方法对于确保对象在集合中的正常使用至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

访问网络附加存储:nfs

文章目录 访问网络附加存储一、网络附加存储1.1、存储类型1.3、通过NFS挂载NAS1.4、NFS挂载过程服务端客户端 二、实验&#xff1a;搭建NFS服务端及挂载到nfs客户端服务端客户端测试命令合集服务端客户端 访问网络附加存储 一、网络附加存储 1.1、存储类型 DAS&#xff1a;Di…

零代码编程:用Kimichat从PDF文件中批量提取图片

一个PDF文件中&#xff0c;有很多图片&#xff0c;想批量提取出来&#xff0c;可以借助kimi智能助手。 在借助kimi智能助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个网页爬取Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹…

2024年融资融券利率最新变化,又降低了?

最近有很多朋友在问我问融资融券的业务&#xff0c;都是比较关心这个利率的问题。确实&#xff0c;做融资融券最重要的利率&#xff0c;利率低会节省很大一笔资金&#xff0c;今天在这边给大家对接一个上市券商&#xff0c;可以给到大家万一的交易佣金和5%的融资利率&#xff0…

乡村振兴规划设计一站式资料大全,能为乡村振兴从业者带来什么帮助?

乡村振兴规划设计一站式资料大全对于乡村振兴从业者来说&#xff0c;具有非常重要的帮助作用。这种资料大全通常包含了从政策解读、市场分析、规划设计、到实施策略等各个方面的详尽信息&#xff0c;能够极大地提升从业者的工作效率和专业能力。 具体来说&#xff0c;乡村振兴规…

Python selenium

1.搭建环境 1.安装&#xff1a; pip install msedge-selenium-tools 不要使用pip install selenium&#xff0c;我的电脑上没法运行 2.下载驱动 Microsoft Edge WebDriver |Microsoft Edge 开发人员 edge浏览器点设置---关于即可找到版本号&#xff0c;一定要下载对应版…

实践精益理念:精益生产培训助力企业持续增长

在日益激烈的市场竞争中&#xff0c;企业如何寻找持续增长的动力&#xff0c;提升整体创新能力和核心竞争力&#xff1f;张驰咨询通过多年来的深入研究和实践&#xff0c;结合众多企业的实际情况&#xff0c;带来了精益生产培训的全新视角。 在近期举办的一次精益生产培训中&am…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 &#xff08;1&#xff09;白鲸优化算法BWO 参考文献&#xff1a;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. &#xff08;2&#xff09;龙格-库塔优化…

服务器数据恢复—RAID5磁盘阵列两块盘离线的数据恢复过程

服务器故障&#xff1a; 服务器中有一组由多块硬盘组建的raid5磁盘阵列&#xff0c;服务器阵列中2块硬盘先后掉线导致服务器崩溃。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘编号后取出&#xff0c;由硬件工程师对掉线的两块磁盘进行物理故障检测&#xff0c…

二层交换机与路由器连通上网实验

华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备&#xff0c;用于在局域网&#xff08;LAN&#xff09;中转发数据帧。它工作在OSI模型的第二层&#xff0c;即数据链路层。二层交换机通过学习和维护MAC地址表&#xff0c;实现了数据的快速转发和广播域的隔离。 实…

java数据结构之数组系统了解

1.数组介绍 数组就是一个存储数据的容器&#xff0c;容器的长度固定、存储元素的数据类型固定。 跟变量加以区分&#xff1a;变量也可以存储数据&#xff0c;但是只能存一个值。当要存的数据比较多的时候&#xff0c;用变量就不方便了。我们就可以使用数组来存储。 1.1数组…

并发编程实现

一、并行编程 1、Parallel 类 Parallel类是System.Threading.Tasks命名空间中的一个重要类&#xff0c;它提供数据并行和任务并行的高级抽象。 For和ForEach Parallel类下的For和ForEach对应着普通的循环和遍历(普通的for和foreach)&#xff0c;但执行时会尝试在多个线程上…

安防视频/视频汇聚系统EasyCVR视频融合云平台助力智能化酒店安防体系的搭建

一、背景需求 2024年“五一”假期&#xff0c;全国文化和旅游市场总体平稳有序。文化和旅游部6日发布数据显示&#xff0c;据文化和旅游部数据中心测算&#xff0c;全国国内旅游出游合计2.95亿人次。“五一”假期县域市场酒店预订订单同比增长68%&#xff0c;而酒店作为一个高…

SpringCloudAlibaba:4.3云原生网关higress的JWT 认证

概述 简介 JWT是一种用于双方之间传递安全信息的简洁的、URL安全的声明规范。 定义了一种简洁的&#xff0c;自包含的方法用于通信双方之间以Json对象的形式安全的传递信息&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO&#xff09;场景 session认证的缺点 1.安…

简单数据结构——栈和队列1(栈超全)(初始化,销毁,出栈入栈销毁实现,例题运用)

知识特点 类似数据表链表&#xff0c;在逻辑上依次存储&#xff0c;但对比顺序表和链表有所限制&#xff0c;不能随便存储 一定要先掌握顺序表的实现&#xff0c;本人博客有顺序表专栏大家可以自行查看&#xff0c;看懂顺序表专栏之后再来了解栈的实现会更容易懂。 如果还没…

使用DBeaver连接postgreSql提示缺少驱动

重新安装电脑之后用dbeaver链接数据库的时候&#xff0c;链接PG库一直提示缺少驱动&#xff0c;当选择下载驱动的时候又非常非常慢经常失败&#xff0c;尝试了一下更改源然后下载库驱动就非常快了&#xff0c;当然也包括dbeaver的自动更新。 方法&#xff1a;点击菜单栏【窗口…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

Seata之AT 模式的使用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Seata 是一款开源的…

ChIP-seq染色质图谱检测方法的局限性及改善方式

ChIP-seq是最广泛使用的染色质图谱检测方法&#xff0c;但有很大的局限性&#xff0c;具体表现为&#xff1a; 1.高细胞需求量&#xff1b; 2.低吞吐量&#xff1b; 3.技术困难&#xff1b; 4.高成本&#xff0c;深度测序&#xff1b; 5.数据质量差&#xff0c;变量大 CUT&…

使用CNN或resnet,分别在flower5,flower17,flower102数据集上实现花朵识别分类-附源码-免费

前言 使用cnn和resnet实现了对flower5&#xff0c;flower17&#xff0c;flower102数据集上实现花朵识别分类。也就是6份代码&#xff0c;全部在Gitee仓库里&#xff0c;记得点个start支持谢谢。 本文给出flower17在cnn网络实现&#xff0c;flower102在resnet网络实现的代码。…

docker私有仓库的registry

简介 Docker私有仓库的Registry是一个服务&#xff0c;主要用于存储、管理和分发Docker镜像。具体来说&#xff0c;Registry的功能包括&#xff1a; 存储镜像&#xff1a;Registry提供一个集中的地方来存储Docker镜像&#xff0c;包括镜像的层次结构和元数据。 版本控制&…