关于hashCode()和equals()的本质区别和联系

java篇20-java中的equals()和==、以及Contains()方法、hashCode()方法 一、equals()和的区别 1.如果是基本类型比较,那么只能用来比较,不能用equals 2.对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。 3.关于类,java中的类都是Object的子类,Object类中的equals()方法是用来比较“地址”。而有些类重写了equals()方法,根据重写的内容实现具体的功能。 二、contains()方法:conta 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 每个Java对象都有 hashCode() 和 equals() 方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在 Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义 hashCode() 和 equals() 时应遵循的规则和指南。您可以在 讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文顶部或底部的 讨论进入论坛。) 虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根 Object 类中使用 hashCode() 方法明确表示期望广泛使用 HashMap (及其前辈 Hashtable )。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。 定义对象的相等性Object 类有两种方法来推断对象的标识: equals() 和 hashCode() 。一般来说,如果您忽略了其中一种,您必须同时忽略这两种,因为两者之间有必须维持的至关重要的关系。特殊情况是根据 equals() 方法,如果两个对象是相等的,它们必须有相同的 hashCode() 值(尽管这通常不是真的)。 特定类的 equals() 的语义在Implementer的左侧定义;定义对特定类来说 equals() 意味着什么是其设计工作的一部分。 Object 提供的缺省实施简单引用下面等式: public boolean equals(Object obj) { return (this == obj); } 在这种缺省实施情况下,只有它们引用真正同一个对象时这两个引用才是相等的。同样, Object 提供的 hashCode() 的缺省实施通过将对象的内存地址对映于一个整数值来生成。由于在某些架构上,地址空间大于 int 值的范围,两个不同的对象有相同的 hashCode() 是可能的。如果您忽略了 hashCode() ,您仍旧可以使用 System.identityHashCode() 方法来接入这类缺省值。 忽略equals() -- 简单实例缺省情况下, equals() 和 hashCode() 基于标识的实施是合理的,但对于某些类来说,它们希望放宽等式的定义。例如, Integer 类定义 equals() 与下面类似: public boolean equals(Object obj) { return (obj instanceof Integer && intValue() == ((Integer) obj).intValue()); } 在这个定义中,只有在包含相同的整数值的情况下这两个 Integer 对象是相等的。结合将不可修改的 Integer ,这使得使用 Integer 作为 HashMap 中的关键字是切实可行的。这种基于值的Equal方法可以由Java类库中的所有原始封装类使用,如 Integer 、 Float 、 Character 和 Boolean 以及 String (如果两个 String 对象包含相同顺序的字符,那它们是相等的)。由于这些类都是不可修改的并且可以实施 hashCode() 和 equals() ,它们都可以做为很好的散列关键字。 为什么忽略equals()和hashCode()?如果 Integer 不忽略 equals() 和 hashCode() 情况又将如何?如果我们从未在 HashMap 或其它基于散列的集合中使用 Integer 作为关键字的话,什么也不会发生。但是,如果我们在 HashMap中 使用这类 Integer 对象作为关键字,我们将不能够可靠地检索相关的值,除非我们在 get() 调用中使用与 put() 调用中极其类似的 Integer 实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的 Integer 对象的一个实例。不用说,这种方法极不方便而且错误频频。 Object 的interface contract要求如果根据 equals() 两个对象是相等的,那么它们必须有相同的 hashCode() 值。当其识别能力整个包含在 equals() 中时,为什么我们的根对象类需要 hashCode() ? hashCode() 方法纯粹用于提高效率。Java平台设计人员预计到了典型Java应用程序中基于散列的集合类(Collection Class)的重要性--如 Hashtable 、 HashMap 和 HashSet ,并且使用 equals() 与许多对象进行比较在计算方面非常昂贵。使所有Java对象都能够支持 hashCode() 并结合使用基于散列的集合,可以实现有效的存储和检索。 实施equals()和hashCode()的需求实施 equals() 和 hashCode() 有一些限制, Object 文件中列举出了这些限制。特别是 equals() 方法必须显示以下属性: Symmetry:两个引用, a 和 b , a.equals(b) if and only if b.equals(a) Reflexivity:所有非空引用, a.equals(a) Transitivity:If a.equals(b) and b.equals(c) , then a.equals(c) Consistency with hashCode() :两个相等的对象必须有相同的 hashCode() 值 Object 的规范中并没有明确要求 equals() 和 hashCode() 必须 一致-- 它们的结果在随后的调用中将是相同的,假设“不改变对象相等性比较中使用的任何信息。”这听起来象“计算的结果将不改变,除非实际情况如此。”这一模糊声明通常解释为相等性和散列值计算应是对象的可确定性功能,而不是其它。 对象相等性意味着什么?人们很容易满足Object类规范对 equals() 和 hashCode() 的要求。决定是否和如何忽略 equals() 除了判断以外,还要求其它。在简单的不可修值类中,如 Integer (事实上是几乎所有不可修改的类),选择相当明显 -- 相等性应基于基本对象状态的相等性。在 Integer 情况下,对象的唯一状态是基本的整数值。 对于可修改对象来说,答案并不总是如此清楚。 equals() 和 hashCode() 是否应基于对象的标识(象缺省实施)或对象的状态(象Integer和String)?没有简单的答案 -- 它取决于类的计划使用。对于象 List 和 Map 这样的容器来说,人们对此争论不已。Java类库中的大多数类,包括容器类,错误出现在根据对象状态来提供 equals() 和 hashCode() 实施。 如果对象的 hashCode() 值可以基于其状态进行更改,那么当使用这类对象作为基于散列的集合中的关键字时我们必须注意,确保当它们用于作为散列关键字时,我们并不允许更改它们的状态。所有基于散列的集合假设,当对象的散列值用于作为集合中的关键字时它不会改变。如果当关键字在集合中时它的散列代码被更改,那么将产生一些不可预测和容易混淆的结果。实践过程中这通常不是问题 -- 我们并不经常使用象 List 这样的可修改对象做为 HashMap 中的关键字。 一个简单的可修改类的例子是Point,它根据状态来定义 equals() 和 hashCode() 。如果两个 Point 对象引用相同的 (x, y) 座标, Point 的散列值来源于 x 和 y 座标值的IEEE 754-bit表示,那么它们是相等的。 对于比较复杂的类来说, equals() 和 hashCode() 的行为可能甚至受到superclass或interface的影响。例如, List 接口要求如果并且只有另一个对象是 List, 而且它们有相同顺序的相同的Elements(由Element上的 Object.equals() 定义), List 对象等于另一个对象。 hashCode() 的需求更特殊--list的 hashCode() 值必须符合以下计算: hashCode = 1; Iterator i = list.iterator(); while (i.hasNext()) { Object obj = i.next(); hashCode = 31*hashCode (obj==null ? 0 : obj.hashCode()); } 不仅仅散列值取决于list的内容,而且还规定了结合各个Element的散列值的特殊算法。( String 类规定类似的算法用于计算 String 的散列值。) 编写自己的equals()和hashCode()方法忽略缺省的 equals() 方法比较简单,但如果不违反对称(Symmetry)或传递性(Transitivity)需求,忽略已经忽略的 equals() 方法极其棘手。当忽略 equals() 时,您应该总是在 equals() 中包括一些Javadoc注释,以帮助那些希望能够正确扩展您的类的用户。 作为一个简单的例子,考虑以下类: class A { final B someNonNullField; C someOtherField; int someNonStateField; } 我们应如何编写该类的 equals() 的方法?这种方法适用于许多情况: public boolean equals(Object other) { // Not strictly necessary, but often a good optimization if (this == other) return true; if (!(other instanceof A)) return false; A otherA = (A) other; return (someNonNullField.equals(otherA.someNonNullField)) && ((someOtherField == null) ? otherA.someOtherField == null : someOtherField.equals(otherA.someOtherField))); } 现在我们定义了 equals() ,我们必须以统一的方法来定义 hashCode() 。一种统一但并不总是有效的定义 hashCode() 的方法如下: public int hashCode() { return 0; } 这种方法将生成大量的条目并显著降低 HashMap s的性能,但它符合规范。一个更合理的 hashCode() 实施应该是这样: public int hashCode() { int hash = 1; hash = hash * 31 someNonNullField.hashCode(); hash = hash * 31 (someOtherField == null ? 0 : someOtherField.hashCode()); return hash; } 注意:这两种实施都降低了类状态字段的 equals() 或 hashCode() 方法一定比例的计算能力。根据您使用的类,您可能希望降低superclass的 equals() 或 hashCode() 功能一部分计算能力。对于原始字段来说,在相关的封装类中有helper功能,可以帮助创建散列值,如 Float.floatToIntBits 。 编写一个完美的 equals() 方法是不现实的。通常,当扩展一个自身忽略了 equals() 的instantiable类时,忽略 equals() 是不切实际的,而且编写将被忽略的 equals() 方法(如在抽象类中)不同于为具体类编写 equals() 方法。关于实例以及说明的更详细信息请参阅 Effective Java Programming Language Guide, Item 7 ( 参考资料) 。 有待改进?将散列法构建到Java类库的根对象类中是一种非常明智的设计折衷方法 -- 它使使用基于散列的容器变得如此简单和高效。但是,人们对Java类库中的散列算法和对象相等性的方法和实施提出了许多批评。 java.util 中基于散列的容器非常方便和简便易用,但可能不适用于需要非常高性能的应用程序。虽然其中大部分将不会改变,但当您设计严重依赖于基于散列的容器效率的应用程序时必须考虑这些因素,它们包括: 太小的散列范围。使用 int 而不是 long 作为 hashCode() 的返回类型增加了散列冲突的几率。 糟糕的散列值分配。短strings和小型integers的散列值是它们自己的小整数,接近于其它“邻近”对象的散列值。一个循规导矩(Well-behaved)的散列函数将在该散列范围内更均匀地分配散列值。 无定义的散列操作。虽然某些类,如 String 和 List ,定义了将其Element的散列值结合到一个散列值中使用的散列算法,但语言规范不定义将多个对象的散列值结合到新散列值中的任何批准的方法。我们在前面 编写自己的equals()和hashCode()方法中讨论的 List 、 String 或实例类 A 使用的诀窍都很简单,但算术上还远远不够完美。类库不提供任何散列算法的方便实施,它可以简化更先进的 hashCode() 实施的创建。 当扩展已经忽略了 equals() 的 instantiable类时很难编写 equals() 。当扩展已经忽略了 equals() 的 instantiable类时,定义 equals() 的“显而易见的”方式都不能满足 equals() 方法的对称或传递性需求。这意味着当忽略 equals() 时,您必须了解您正在扩展的类的结构和实施详细信息,甚至需要暴露基本类中的机密字段,它违反了面向对象的设计的原则。 结束语通过统一定义 equals() 和 hashCode(), 您可以提升类作为基于散列的集合中的关键字的使用性。有两种方法来定义对象的相等性和散列值:基于标识,它是 Object 提供的缺省方法;基于状态,它要求忽略 equals() 和 hashCode() 。当对象的状态更改时如果对象的散列值发生变化,确信当状态作为散列关键字使用时您不允许更更改其状态。 参考资料 您可以参阅本文在 developerWorks 全球站点上的 英文原文. 参加本文的 讨论论坛。(您还可以点击本文顶部或底部的 讨论进入论坛。) 阅读Brian Goetz撰写的一整套 Java理论和实践文章 。尤其是2003年2月“ Java 理论与实践:变还是不变?,”它讨论使用可变对象作为散列关键字的危害。 Joshua Bloch杰作的第 7和 8部分 Java编程语言指南 ,详细阐述围绕 equals() 和 hashCode() 的问题。 Tony Sintes在 JavaWorld提供的本文中解释 基于散列的容器是如何工作的以及如何使用 equals() 和 hashCode() (2002年7月)。 在幻灯片中,新西兰奥克兰大学计算机科学系的Robert Uzgalis介绍一些 Java散列模式的批评意见,解释一些散列函数背后的问题。 Mark Roulo 在自己的文章“如何避免陷阱和正确忽略java.lang.Object的方法”( JavaWorld, 1999年1月)一文中提供了一些 忽略 equals() 和 hashCode() 的实例程序代码 。 新西兰坎特伯雷大学计算机科学系提供的这一份技术报告详细描述了 what makes an effective hash function(PDF)。 IBM软件实验室软件工程师Sreekanth Iyer 探讨了Java对象相等性的各种不同意义( developerWorks, 2002年9月)。 JavaWorld(获得许可后才可再版)的提示略微谈到 相等性比较的缺陷。 在 developerWorksJava技术专区 可以找到数百篇有关 Java 技术的参考资料。.
Java中==、equals()和hashCode()的深度解析 Java提供了三种对象比较方式:==运算符、equals()方法和hashCode()方法。==比较对象内存地址,判断是否为同一实例;equals()用于逻辑相等比较,可被重写以实现自定义相等规则;hashCode()生成哈希码,主要用于哈希集合。三者之间存在契约关系:若equals()判定两对象相等,则其hashCode()必须相同。重写equals()时需遵循自反性、对称性等原则,并配套重写hashCode(),通常使用Objects.hash()或31素数乘法算法实现。 阅读详情

相关推荐

详解hashCode()和equals()的本质区别和联系

主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下。

equals方法和hashcode方法的区别和联系

比较equals方法和hashcode方法的区别和联系。 (1) 区别: equals():反映的是对象或变量具体的值,即两个对象里面包含的值可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,...

weixin_43693592的博客 4832

Windows服务器XMRig挖矿病毒深度清除实战指南

XMRig是一种广泛用于Monero(XMR)加密货币挖矿的开源工具,其在Windows环境中的持久化机制已远超传统木马范畴,融合WMI事件订阅、服务伪装、PowerShell无文件执行与注册表隐写等多重反检测技术。理解其基于行为而非特征的生存逻辑,是实现有效检测与根除的前提。该技术具备强隐蔽性、高自愈性与网络通信合法化特征,常见于RDP弱口令爆破、SMB共享泄露及PowerShell远程执行等非漏洞类入侵场景。本文聚焦Windows原生命令与Sysinternals工具链,提供覆盖进程定位、WMI清理、服

weixin_30535843的博客 735

JAVA之==与equals,equals与hashcode区别与联系

1."=="与equals的区别与联系 (1)“==”对于基本数据类型,只要值相等,就返回true,否则返回false。 若比较的为对象,则判断的是两个对象是否处于同一个内存地址。 (2)equals为Object类中的方法,Object中equals默认使用==来判断,因此一般来讲equals与“==”并无区别,完全相同。 Object是所有类的父类,在不少类中都对equals进行了重写,比如最常用的String类,因此在String中比较的是值,而非地址。 ...

老布丁的博客 1118

SAP面试全过程(已拿offer)

周五打电话给我说过了SAP第一轮面试,第二轮要在下周四北京,这几天终于体会到了什么叫做重压下的感觉,越复习越虚,看别人的面经都感觉卧槽这问题也巨难了吧...连去北京可以见妹子这种事情都感觉一点心情都没有。面前准备固然是要有的,但关键是平时就要有料,多想想自己做的项目。当作一个给自己的提醒吧!

cloudray8580的专栏 4万+

从门禁到支付:Uniapp+NFC开发避坑指南(支持Mifare Classic)

本文详细介绍了Uniapp结合NFC技术开发门禁与支付系统的实战指南,特别针对Mifare Classic卡片进行深度优化。内容涵盖环境配置、设备兼容性处理、卡片安全机制解析以及高性能读写优化策略,帮助开发者快速实现跨平台的智能硬件交互解决方案。

t1u2v的博客 751

hashCode()和equals()的区别和联系

重写hashCode和equals方法

qq_39190679的博客 1472

ESP32-CAM入门教程

ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。

qq_48778364的博客 3万+

hashCode()与equals()的区别与联系

文章目录一、什么是equals()二、什么是hashCode()三、hashCode是如何得到的1. 类重写了hashCode()2. 类没有重写hashCode()四、总结1. hashCode()和equals()的比较2. 为何hashCode()和equals()搭配使用比较对象时能提高效率 一、什么是equals() 我们先来看下再熟悉不过的equals方法。以下是java api对equals()方法的说明: 从上面关于equals的说明,我们可以得出以下几点: equals用来判断两

轨迹_Mine的博客 869

多堆燃料电池-蓄电池混合动力系统能量管理策略研究

摘要 本研究针对多堆燃料电池-蓄电池混合动力系统,提出三种能量管理策略并进行对比分析。系统采用双燃料电池堆与锂离子蓄电池并联结构,通过建立精确的数学模型描述各组件动态特性。研究设计了规则型策略、模糊逻辑控制策略和等效氢耗最小化策略,重点解决了多堆系统功率分配与蓄电池SOC平衡问题。基于MATLAB/Simulink平台的仿真结果表明,模糊逻辑控制策略在氢耗经济性方面表现最优,相比传统规则型策略可降低5%-10%的氢耗,同时有效抑制燃料电池功率波动。本文提出的策略框架为重型商用车的燃料电池混合动力系统提供了可

huanghm88的专栏 177

基于STM32L4XX、HAL库的YT8531C-CA以太网收发器(PHY)驱动程序设计

是一款由裕太微推出的高性价比、低功耗的单端口 10/100M 以太网物理层收发器(PHY)。它通过标准的 MII(介质独立接口)或 RMII(精简介质独立接口)与微控制器的 MAC 层连接,实现将数字信号与网络模拟信号之间的转换。支持自动协商(Auto-Negotiation),自动选择最高速率和双工模式。支持 HP Auto-MDIX(自动交叉直连),无需区分直通线或交叉线。低功耗设计,特别适合电池供电或对功耗敏感的 STM32L4 应用。支持 MII 和 RMII 接口,节省引脚(RMII模式)。

zhusl6688的博客 628

hashCode()和equals()的区别

一、hashCode()和equals()是什么? hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。 二、hashCode()和equals()的区别 下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们之间的主要区别也基本体现在这里。 1、equals()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,

一蓑烟雨任平生 3949

K-Core, K-Shell & K-Crust傻傻分不清楚

K-Core(K-核)就是所有大于等于K的K-Shell的并集;K-Crust(K-皮)就是所有小于等于K的K-shell的并集。

欢迎订阅 -- 小源笔迹 2257

【转载】详解hashCode()和equals()的本质区别和联系

详解hashCode()和equals()的本质区别和联系: https://www.jb51.net/article/124966.htm Java中的equals和hashCode方法详解: https://www.jb51.net/article/96138.htm 探索Java中的equals()和hashCode()方法:https://www.jb51.net/article/11...

区块链之美 434

HMC7044调试指南与FPGA开发

最后,我们介绍了在FPGA开发中使用HMC7044的几个常见应用场景,包括时钟分配、时钟同步、高精度时钟生成和时钟域交叉。根据您的应用需求,您可以选择不同的时钟分配方案,例如使用PLL生成特定频率的时钟信号,或者通过分频器生成较低频率的时钟信号。HMC7044可以提供精确的时钟同步功能,确保各个FPGA板之间的时钟信号保持一致,从而实现可靠的数据传输和协同操作。HMC7044可以实现时钟域之间的交叉,通过生成和分配不同频率的时钟信号,使得不同时钟域的模块能够协同工作。FPGA开发中的HMC7044应用。

CqpFsharp的博客 3621

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

hashCode()和equals()的本质区别和联系

    每个Java对象都有 hashCode() 和 equals() 方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在 Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义 hashCode() 和 equals() 时应遵循的规则和指南。您可以在 讨论论坛与作者和其它读者一同探讨您对本文

天山童老的专栏 792

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java基础-hashCode()和equals()的本质区别和联系

在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equals是Object类提供的方法之一,众所周知,每一个java类都继承自Object类, 所以说每一个对象都有equals这个方法。而我们在用这个方法时却一般都重写这

敲代码的乔帮主 547

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

equals()是判读两个Set是否相等[前提是equals()在类中被覆盖]。==决定引用值是否指向同一对象。 1、当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到一个位置来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equal

6537

Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

http://blog.youkuaiyun.com/lishehe/article/details/18839495 在学习Java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equals是Object类提供的方法之一,众所周知,每一个java类都继承自O

wu_wenhuan的专栏 326

hashCode()与equals()方法

Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

dai_的专栏 442

Java 中的 hashCode () 与 equals () 核心原理、契约规范、重写实践与面试全解

本文是Java数据结构学习笔记系列,涵盖JAVA初阶到数据结构核心内容,包括集合、泛型、List、ArrayList、LinkedList、栈、队列、二叉树、堆等专题。重点解析了Object类中equals()和hashCode()方法的定义、实现、区别及使用规范,强调重写equals()必须同时重写hashCode()的重要性。通过HashMap源码分析,展示了这两个方法在哈希集合中的关键作用,并提供标准重写模板和IDEA生成技巧。

HRDMN的博客 428

Java对象比较:==与equals()的深度解析

在Java编程中,对象比较是基础但关键的操作,涉及引用比较与内容比较两种机制。==运算符用于比较基本数据类型的值或对象的引用地址,而equals()方法则用于比较对象的内容逻辑相等性。理解这两种比较方式的区别对于避免常见编程错误至关重要,特别是在处理字符串、集合框架和自定义对象时。从JVM实现层面看,==直接比较栈顶引用,性能更高;而equals()作为方法调用更灵活但开销略大。实际开发中,正确使用比较机制能提升代码健壮性,如在哈希集合操作时必须保持equals()与hashCode()的一致性。掌握这些核

weixin_34327223的博客 365

Java中==与equals()的终极对决

摘要:Java中==比较对象引用或基本类型值,equals()默认比较引用但可重写为逻辑相等。hashCode()返回对象的哈希码,用于哈希表存储,需与equals()保持一致。HashMap利用hashCode定位键值对,要求相等的对象必须哈希码相同。若重写equals()必须同时重写hashCode(),否则会导致哈希集合异常。正确实现应保证:相等对象哈希码相同,不等对象尽量不同,且哈希计算高效。不可变对象更适合作为HashMap键以保持哈希稳定性。

weixin_52139076的博客 466

Java中==和equals()的区别?

比较项==运算符equals()方法基本类型比较值不适用(只能用于对象)引用类型比较对象地址默认比较地址,但通常被重写为比较内容可否被重写❌ 不可重写✅ 可以重写(推荐对自定义类也进行重写)安全性无需担心空指针异常调用前应确保对象不为 null,否则抛出 NullPointerException常见用途判断是否是同一个对象判断两个对象的内容是否逻辑上相等equals()如果你自己写的类希望支持有意义的equals()重写方法。(推荐)同时重写hashCode()

weixin_61523952的博客 533

Java 中 == 与 equals() 的区别

Java中==与equals()的区别: ==用于基本类型比较值,引用类型比较内存地址 equals()是Object类方法,默认比较地址,但String/包装类等通过重写实现内容比较 关键区别:==判断"是否同一个对象",equals()判断"逻辑是否相等" 注意事项:字符串常量池、包装类缓存、equals与hashCode契约 实用建议:比较对象内容用equals(),基本类型用==,null安全比较推荐"常量.equals(变量)"

2303_77517907的博客 1062

深入解析Java中的hashCode与equals方法:从理论到应用

本文深入解析了Java中hashCode()和equals()方法的核心作用及其相互关系。hashCode()方法用于生成对象哈希码,支持哈希表高效存储;equals()方法则用于内容比较。两者协同工作确保集合操作的高效性:若equals()判定相等,则hashCode()必须相同,但哈希码相同不一定内容相等。文章详细探讨了哈希碰撞、String类实现、HashMap/HashSet底层机制,以及equals与==操作符的区别,为Java开发者提供了深入理解这两个关键方法的系统指导。

2301_82241176的博客 341
上一篇: JBoss发布Seam测试版 简化Java应用开发
下一篇: 创建电信网络实时监控图――电信网管中的Java客户端系列(四)
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值