网站外链建设工作计划建站合作

news/2025/9/26 18:02:52/文章来源:
网站外链建设工作计划,建站合作,一个空间可以做多个网站吗,中外商贸网站建设平台第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码#xff0c;也称为散列码#xff1b;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中#xff0c;这就意味着Java中的任何类都包含有hashCo…第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码也称为散列码它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中这就意味着Java中的任何类都包含有hashCode() 函数。         虽然每个Java类都包含hashCode() 函数。但是仅仅当创建并某个“类的散列表”(关于“散列表”见下面说明)时该类的hashCode() 才有用(作用是确定该类的每一个对象在散列表中的位置其它情况下(例如创建类的单个对象或者创建类的对象数组等等)类的hashCode() 没有作用。        上面的散列表指的是Java集合中本质是散列表的类如HashMapHashtableHashSet。 也就是说hashCode() 在散列表中才有用在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码进而确定该对象在散列表中的位置。 OK至此我们搞清楚了hashCode()的作用是获取散列码。但是散列码是用来干什么的呢为什么散列表需要散列码呢要解决这些问题就需要理解散列表关于散列表的内容非三言两语道的明白大家可以通过下面几篇文章来学习 [转载] 散列表(Hash Table)从理论到实用上 [转载] 散列表(Hash Table)从理论到实用中 [转载] 散列表(Hash Table)从理论到实用下  为了能理解后面的内容这里简单的介绍一下散列码的作用。 我们都知道散列表存储的是键值对(key-value)它的特点是能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码 散列表的本质是通过数组实现的。当我们要获取散列表中的某个“值”时实际上是要获取数组中的某个位置的元素。而数组的位置就是通过“键”来获取的更进一步说数组的位置是通过“键”对应的散列码计算得到的。 下面我们以HashSet为例来深入说明hashCode()的作用。 假设HashSet中已经有1000个元素。当插入第1001个元素时需要怎么处理因为HashSet是Set集合它允许有重复元素。         “将第1001个元素逐个的和前面1000个元素进行比较”显然这个效率是相等低下的。散列表很好的解决了这个问题它根据元素的散列码计算出元素在散列表中的位置然后将元素插入该位置即可。对于相同的元素自然是只保存了一个。         由此可知若两个元素相等它们的散列码一定相等但反过来确不一定。在散列表中                            1、如果两个对象相等那么它们的hashCode()值一定要相同                            2、如果两个对象hashCode()相等它们并不一定相等。                            注意这是在散列表中的情况。在非散列表中一定如此 对“hashCode()的作用”就谈这么多。 第4部分 hashCode() 和 equals() 的关系 接下面我们讨论另外一个话题。网上很多文章将 hashCode() 和 equals 关联起来有的讲的不透彻有误导读者的嫌疑。在这里我自己梳理了一下 “hashCode() 和 equals()的关系”。 我们以“类的用途”来将“hashCode() 和 equals()的关系”分2种情况来说明。 1. 第一种 不会创建“类对应的散列表” 这里所说的“不会创建类对应的散列表”是说我们不会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中用到该类。例如不会创建该类的HashSet集合。 在这种情况下该类的“hashCode() 和 equals() ”没有半毛钱关系的         这种情况下equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用所以不用理会hashCode()。 下面我们通过示例查看类的两个对象相等 以及 不等时hashCode()的取值。 源码如下 (NormalHashCodeTest.java) import java.util.*; import java.lang.Comparable;/*** desc 比较equals() 返回true 以及 返回false时 hashCode()的值。** author skywang* emai kuiwu-wang163.com*/ public class NormalHashCodeTest{public static void main(String[] args) {// 新建2个相同内容的Person对象// 再用equals比较它们是否相等Person p1 new Person(eee, 100);Person p2 new Person(eee, 100);Person p3 new Person(aaa, 200);System.out.printf(p1.equals(p2) : %s; p1(%d) p2(%d)\n, p1.equals(p2), p1.hashCode(), p2.hashCode());System.out.printf(p1.equals(p3) : %s; p1(%d) p3(%d)\n, p1.equals(p3), p1.hashCode(), p3.hashCode());}/*** desc Person类。*/private static class Person {int age;String name;public Person(String name, int age) {this.name name;this.age age;}public String toString() {return name - age;}/** * desc 覆盖equals方法 */ public boolean equals(Object obj){ if(obj null){ return false; } //如果是同一个对象返回true反之返回false if(this obj){ return true; } //判断是否类型相同 if(this.getClass() ! obj.getClass()){ return false; } Person person (Person)obj; return name.equals(person.name) ageperson.age; } } } 运行结果 p1.equals(p2) : true; p1(1169863946) p2(1901116749) p1.equals(p3) : false; p1(1169863946) p3(2131949076) 从结果也可以看出p1和p2相等的情况下hashCode()也不一定相等。 2. 第二种 会创建“类对应的散列表” 这里所说的“会创建类对应的散列表”是说我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中用到该类。例如会创建该类的HashSet集合。 在这种情况下该类的“hashCode() 和 equals() ”是有关系的         1)、如果两个对象相等那么它们的hashCode()值一定相同。               这里的相等是指通过equals()比较两个对象时返回true。         2)、如果两个对象hashCode()相等它们并不一定相等。                因为在散列表中hashCode()相等即两个键值对的哈希值相等。然而哈希值相等并不一定能得出键值对相等。补充说一句“两个不同的键值对哈希值相等”这就是哈希冲突。 此外在这种情况下。若要判断两个对象是否相等除了要覆盖equals()之外也要覆盖hashCode()函数。否则equals()无效。 例如创建Person类的HashSet集合必须同时覆盖Person类的equals() 和 hashCode()方法。         如果单单只是覆盖equals()方法。我们会发现equals()方法没有达到我们想要的效果。 参考代码 (ConflictHashCodeTest1.java) import java.util.*; import java.lang.Comparable;/*** desc 比较equals() 返回true 以及 返回false时 hashCode()的值。** author skywang* emai kuiwu-wang163.com*/ public class ConflictHashCodeTest1{public static void main(String[] args) {// 新建Person对象Person p1 new Person(eee, 100);Person p2 new Person(eee, 100);Person p3 new Person(aaa, 200);// 新建HashSet对象 HashSet set new HashSet();set.add(p1);set.add(p2);set.add(p3);// 比较p1 和 p2 并打印它们的hashCode()System.out.printf(p1.equals(p2) : %s; p1(%d) p2(%d)\n, p1.equals(p2), p1.hashCode(), p2.hashCode());// 打印setSystem.out.printf(set:%s\n, set);}/*** desc Person类。*/private static class Person {int age;String name;public Person(String name, int age) {this.name name;this.age age;}public String toString() {return (name , age);}/** * desc 覆盖equals方法 */ Overridepublic boolean equals(Object obj){ if(obj null){ return false; } //如果是同一个对象返回true反之返回false if(this obj){ return true; } //判断是否类型相同 if(this.getClass() ! obj.getClass()){ return false; } Person person (Person)obj; return name.equals(person.name) ageperson.age; } } } 运行结果 p1.equals(p2) : true; p1(1169863946) p2(1690552137) set:[(eee, 100), (eee, 100), (aaa, 200)] 结果分析 我们重写了Person的equals()。但是很奇怪的发现HashSet中仍然有重复元素p1 和 p2。为什么会出现这种情况呢 这是因为虽然p1 和 p2的内容相等但是它们的hashCode()不等所以HashSet在添加p1和p2的时候认为它们不相等。 下面我们同时覆盖equals() 和 hashCode()方法。 参考代码 (ConflictHashCodeTest2.java) import java.util.*; import java.lang.Comparable;/*** desc 比较equals() 返回true 以及 返回false时 hashCode()的值。** author skywang* emai kuiwu-wang163.com*/ public class ConflictHashCodeTest2{public static void main(String[] args) {// 新建Person对象Person p1 new Person(eee, 100);Person p2 new Person(eee, 100);Person p3 new Person(aaa, 200);Person p4 new Person(EEE, 100);// 新建HashSet对象 HashSet set new HashSet();set.add(p1);set.add(p2);set.add(p3);// 比较p1 和 p2 并打印它们的hashCode()System.out.printf(p1.equals(p2) : %s; p1(%d) p2(%d)\n, p1.equals(p2), p1.hashCode(), p2.hashCode());// 比较p1 和 p4 并打印它们的hashCode()System.out.printf(p1.equals(p4) : %s; p1(%d) p4(%d)\n, p1.equals(p4), p1.hashCode(), p4.hashCode());// 打印setSystem.out.printf(set:%s\n, set);}/*** desc Person类。*/private static class Person {int age;String name;public Person(String name, int age) {this.name name;this.age age;}public String toString() {return name - age;}/** * desc重写hashCode */ Overridepublic int hashCode(){ int nameHash name.toUpperCase().hashCode();return nameHash ^ age;}/** * desc 覆盖equals方法 */ Overridepublic boolean equals(Object obj){ if(obj null){ return false; } //如果是同一个对象返回true反之返回false if(this obj){ return true; } //判断是否类型相同 if(this.getClass() ! obj.getClass()){ return false; } Person person (Person)obj; return name.equals(person.name) ageperson.age; } } } 运行结果 p1.equals(p2) : true; p1(68545) p2(68545) p1.equals(p4) : false; p1(68545) p4(68545) set:[aaa - 200, eee - 100] 结果分析 这下equals()生效了HashSet中没有重复元素。         比较p1和p2我们发现它们的hashCode()相等通过equals()比较它们也返回true。所以p1和p2被视为相等。         比较p1和p4我们发现虽然它们的hashCode()相等但是通过equals()比较它们返回false。所以p1和p4被视为不相等。 转发:https://www.cnblogs.com/skywang12345/p/3324958.html

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

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

相关文章

详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学

详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

静态网站可以做哪些wordpress有后端吗

一.选择题 1、适宜采用inline定义函数情况是(C) A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&#xff0c…

网站开发招标参数学校网站建设的应用意义案例

来源:SpringBoot 那些天生自带 Buff 的工具类,你用过几个? 断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert …

不用js可以做网站吗网站建设费应开具互联网信息服务吗

本文主要向大家介绍了MySQL数据库之在CentOS7上安装MySQL5.7 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。获取RPM包# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm列出RPM包里都有哪些文件# rpm -q…

公司网站建设应注意事项北京的软件公司集中在哪个区

文章目录 9.1 DApp 的架构和设计9.1.1 基础知识解析更深入的理解实际操作技巧 9.1.2 重点案例:去中心化社交媒体平台案例 Demo:创建去中心化社交媒体平台案例代码SocialMedia.sol - 智能合约前端界面 测试和验证拓展功能 9.1.3 拓展案例 1:去…

59网站一起做网店普宁网站 代备案

1.开启时钟 把需要使用的USART和GPIO的时钟打开 2.GPIO初始化 把TX配置成复用输出,RX配置成输入 3.配置USART 直接使用一个结构体即可将所有参数配置完成 4.开关控制 如果需要仅发送的功能,就直接开启USART&#xff…

网站后台程序手机网页怎么改成电脑版

现在越来越多的人都开始通过二维码的方式来传递文件,将word、pdf、excel、pdf等格式的文件通过扫码的方式展示或者下载文件,这种方式有很多的优势,包括传播速度快成本低,只需要生成一张二维码图片,就可以让其他人能够同…

使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案

使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

单独

单独Q2的季度工作总结: 重点工作任务(含项目) 重点工作任务完成情况 "目标设定说明: 目标设定要符合SMART原则(Specific具体的、Measurable可衡量的、Attainable可达到的、Ralevant相关的、Time-based有时间…

为什么应该测试无JavaScript的页面体验

本文探讨了JavaScript可能失效的各种场景(如网络问题、浏览器扩展限制等),介绍了渐进增强的实践方法,并说明了当页面必须依赖JavaScript时的优雅降级方案。通过具体代码示例展示如何构建更具韧性和可访问性的网站。…

完整教程:UE5小游戏开发 - 武士决斗

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡1 DIP核心思想与三层架构概述 依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模…

网站开发费入什么科目个人简介html代码简单

前言 JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象; DOM 描述了处理网页内容的方法和接口; BOM 描述了与浏览器进行交互的方法和接口。 ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一…

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE 文档来自:PolarFire FPGA and PolarFire SoC FPGA Programming User GuidePolarFire SOC Auto Update 和 IAP 文档阅读一 - 所长 - 博客园 PolarFire SO…

前台部分数据不显示

去数据库查了下,数据都存在,很完整,原因就在前台。 查出来的数据量很大,删除部分数据后,前台正常显示了,应该就是数据量太多,序列化的时候出问题了。 查了下,JsonConvert.SerializeObject 没有“字数”限制,但…

指针定义以及二维数组内存地址(java/c++/python)

一、指针是什么? 指针是一个存储内存地址的变量,它指向(引用)内存中的另一个数据(变量、数组、对象等)。通过指针可以直接访问或修改它所指向的内存中的数据,这使得指针成为直接操作内存的重要工具。 简单说:指…

一款不错的PDF工具,吾爱出品 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解码数据结构线性表之顺序表

顺序表的本质与核心特性 顺序表的定义 顺序表是 “用一组内存地址连续的内存单元依次存储线性表数据元素的存储结构”,其核心是 “逻辑顺序与物理顺序完全一致”—— 即线性表中第i个元素(逻辑上),必然存储在与第i…

中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃

源启数据集成平台作为源启数据资产平台的重要组成部分,专注于实现跨源数据的高效汇聚与迁移,提供一站式数据集成服务。平台适用于银行、保险、证券、能源、制造等行业,能够实现对多源异构数据从采集、转换到写入的全…

Jupyter NoteBook / Jupyter Lab的安装与使用

Jupyter Lab是Jupyter NoteBook的下一代产品,这两个产品都是基于浏览器的代码编写、运行及文档编辑的交互式环境。Jupyter Lab是Jupyter NoteBook的下一代产品,这两个产品都是基于浏览器的代码编写、运行及文档编辑的…