equal&==&hashcode

简介: == 和 equals 的区别 Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

== 和 equals 的区别

Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

“==”比”equal”运行速度快,因为”==”只是比较引用. 

hashcode 和 equals 的具体实现方式  

默认 equals 方法直接调用了 ==

public boolean equals(Object obj) {

    return (this == obj);

}

String 改写了 equals

public boolean equals(Object anObject) {

         if (this == anObject) {

             return true;

         }

         if (anObject instanceof String) {

             String anotherString = (String) anObject;

             int n = value.length;

             if (n == anotherString.value.length) {

                 char v1[] = value;

                 char v2[] = anotherString.value;

                 int i = 0;

                 while (n-- != 0) {

                     if (v1[i] != v2[i])

                             return false;

                     i++;

                 }

                 return true;

             }

         }

         return false;

     }

hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。

String类源码中重写的hashCode方法如下:

public int hashCode() {

    int h = hash;    //Default to 0 ### String类中的私有变量,

    if (h == 0 && value.length > 0) {    //private final char value[]; ### Sting类中保存的字符串内容的的数组

        char val[] = value;

 

        for (int i = 0; i < value.length; i++) {

            h = 31 * h + val[i];

        }

        hash = h;

    }

    return h;

}

 

总结:

(1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

(2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。

(3)默认。==默认比较对象在JVM中的地址。hashCode 默认返回对象在JVM中的存储地址。equal比较对象,默认也是比较对象在JVM中的地址,同==

 

目录
相关文章
|
8月前
|
机器学习/深度学习 算法 安全
NeurIPS 2024:数学推理场景下,首个分布外检测研究成果来了
在深度学习领域,模型的鲁棒性与可靠性至关重要。针对数学推理这一复杂生成场景,传统OOD检测方法因输出空间高密度特征而面临挑战。为此,研究团队提出基于轨迹波动性的TV分数方法,通过计算样本嵌入偏移轨迹的波动性来检测OOD样本。实验表明,该方法在数学推理和选择题任务中优于传统算法,展示了其潜在优势和通用性。尽管存在局限性,TV分数为数学推理场景下的OOD检测提供了创新思路。论文地址:https://arxiv.org/abs/2405.14039
203 2
|
11月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的2FSK调制解调系统,包含高斯信道、误码率统计模块及testbench。系统增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同SNR下的硬件测试,并提供操作视频指导。理论部分涵盖频移键控(FSK)原理,包括相位连续与不连续FSK信号的特点及功率谱密度特性。Verilog代码实现了FSK调制解调的核心功能,支持在不同开发板上移植。硬件测试结果展示了不同SNR下的性能表现。
345 6
|
SQL Oracle 关系型数据库
MySQL数据库,从入门到精通:第一篇——MySQL概念详解(二)
MySQL数据库,从入门到精通:第一篇——MySQL概念详解(二)
710 0
|
算法 安全 区块链
区块链如何实现交易匿名性
**区块链匿名性摘要:** - 匿名性源于公钥/私钥系统,公钥作地址,私钥验证交易,不透露身份信息。 - Coin Mixing 和 CoinJoining 混合交易,使资金流向难以追踪。 - 匿名币如 Monero、Zcash 使用零知识证明和环签名技术增强匿名。 - 隐身地址和一次性地址增加隐私,公私钥交换确保安全交易而不暴露身份。 - 多层次加密与协议结合,保障区块链交易隐私。
|
弹性计算 对象存储 CDN
阿里云服务器流量怎么收费?多少钱1GB流量?
阿里云服务器流量怎么收费?多少钱1GB流量?0.8元每GB,如果是北京、上海、深圳、杭州等地域的话,中国香港1GB流量要1元
2058 0
阿里云服务器流量怎么收费?多少钱1GB流量?
|
iOS开发
iOS蓝牙状态的处理(蓝牙关闭及未授权的处理)
iOS蓝牙状态的处理(蓝牙关闭及未授权的处理)
1242 0
iOS蓝牙状态的处理(蓝牙关闭及未授权的处理)
即插即用,基于阿里云Ganos快速构建云上开源GIS方案
对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定、廉价、实用的GIS解决方案。本文介绍如何将阿里云POLARDB/PG Ganos时空数据库引擎作为数据源与GeoServer、uDig、QGIS等最常用的开源GIS软件对接,构建即插即用基于开源GIS应用方案。
23311 0
Python的for循环如何同时输出两个或者多个值,报错ValueError: too many values to unpack (expected 3)
Python的for循环如何同时输出两个或者多个值,报错ValueError: too many values to unpack (expected 3)