当前位置: 首页 > news >正文

JAVA之equals对于引用类型比较的方式不同呢

因为equals这个方法是Object,所以我们首先查看一下Object对与此方法的解释:

Objec类equals方法(源码):

    public boolean equals(Object obj) {
        return (this == obj);
    }

源码分析:在“JAVA之“==”和“equals”的区别”这篇博客中,我详细的说明了“==”的作用,除了基本数据类型以外,使用它比较的都是两个变量的引用地址。由此知,Object中的equals方法比较的是引用的地址。

我们都知道在JAVA中,Object是所有对象的父类,那么为什么字符串,基本数据类型的包装类型中使用equals比较的是两个变量的内容,而不是两个变量的地址呢?

官方对于Object对象的equals方法的解释:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
官方解释到,Object的equals方法是可以被重写的,并且在重写时,也必须重写 hashCode方法。

从文档中得知,equals方法可以被重写,所以在字符串中,基本数据类型的包装类型中此方法比较的发生变化,是不是此方法被重写了呢?我们看源码,如下:

String类源码:

 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;
    }

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

代码分析:

同过查看String类的源码,我们发现String对象确实重写了Object对象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;
    }
Integer类源码:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }


    @Override
    public int hashCode() {
        return Integer.hashCode(value);
    }
代码分析:

Integer跟String一样,重写了Ojbect对象的方法。return value == ((Integer)obj).intValue(); 在这句代码中,首先将obj强转成Integer对象,在使用intValue转成了int,所以最终采用的是基本数据类型的比较。

总结:以上是对于equls方法的分析。如有不足,望大神们多多指点。谢谢。


相关文章:

  • JAVA之String,StringBuffer与StringBuilder三者之间的区别
  • JAVA之冒泡(Bubble)排序
  • JAVA之选择排序
  • JAVA之插入排序
  • JAVA之类,构造函数和构造代码块
  • JAVA面试题之冒泡排序,插入排序及选择排序
  • Linux安装JDK步骤
  • Linux之ssh,scp命令的使用
  • Linux之ssh免密登录
  • Hadoop-2.8.0安装教程---单机/伪分布式配置
  • Java之序列化与反序列化
  • Hadoop之常用shell命令整理
  • Itext笔记之pdf页眉页脚
  • JAVA操作HDFS案例
  • zookeeper-3.4.10安装教程---分布式配置
  • 分享一款快速APP功能测试工具
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【React系列】如何构建React应用程序
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • React的组件模式
  • vue 配置sass、scss全局变量
  • vuex 笔记整理
  • Webpack 4 学习01(基础配置)
  • 对象管理器(defineProperty)学习笔记
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 智能合约Solidity教程-事件和日志(一)
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • AI算硅基生命吗,为什么?
  • #1015 : KMP算法
  • %@ page import=%的用法
  • (2015)JS ES6 必知的十个 特性
  • (3)STL算法之搜索
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)Linux Shell编程——输入输出重定向
  • (转)iOS字体
  • (转)Windows2003安全设置/维护
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)虚函数剖析
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET NPOI导出Excel详解
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 设计模式初探
  • .NET导入Excel数据
  • .NET企业级应用架构设计系列之技术选型
  • @Bean有哪些属性
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [Android]一个简单使用Handler做Timer的例子
  • [BZOJ5250][九省联考2018]秘密袭击(DP)