彻透理解==、equals和hashCode

一、equals和hashCode方法主要的区别在于
性能,可靠性;对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较。
1、hashcode和equals的区别
equals和hashCode方法主要的区别在于:性能,可靠性;
equals方法:因为hashCode并不是完全可靠的,有时候不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题),所以hashCode并不是完全可靠的,只能通过equals保证两个对象确实相等。
hashCode方法:因为重写equals方法比较复杂,调用equals方法比较对象是否相等的效率比较低,而利用hashCode进行对比,只需要生成一个hash值进行比较就可以,效率较高。
实际应用:对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较,如果hashCode相等,再用equals对比,euqals相同则表示这两个对象确实相同,既提高了执行效率也保证了可靠性。
2、hashcode和equals的介绍
1.hashCode介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。
这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
2.equals介绍
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。
同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。

二、equals和==的区别是什么
1、含义不同:
= =是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。(比较地址值即是指是否为同一个对象的引用)equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。
2、引用不同:
值类型(int,char,long,bolean等)都是用=判断相等性。对象引用的话,=判断引用所指的对象是否是同一个。equals是Object的成员函数,有些类会覆盖(overide)这个方法,用于判断对象的等价性。
3、方法不同:
String里的方法,如果= =号比较不相等,还会进行一下值的比较。所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和= =号等价。

请添加图片描述
扩展资料:

Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回true
s1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true
//如果
s1 = "sony";
s2 = "sony";
s1.equals(s2); 或者string.equals(s1,s2);//返回true

三、什么是equals、hashCode
equals( ),hashCode( )都属于Object类的方法,而在Java中所有的类都继承Object类。

在Object类中 :
1、不被重写的equals方法是判断两个引用是否指向堆内存中的同一块地址
2、不被重写的hashCode是根据内存地址计算出hash值。

所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。那么为什么在重写equals方法的时候需要重写hashCode方法呢?

  我们先来看一下Object.hashCode的通用约定(摘自《Effective Java》第45页)

1、在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
2、如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
3、如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。

所以如果只重写了equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)。

四、==比较引用数据类型为数字类型时,超过常量池范围处理

public void testT() {
    Integer a1 = 127;
    Integer b1 = 127;
    if(a1==b1){
        System.out.println("a1和b1相等");
    }else{
        System.out.println("a1和b1不等");
    }

    Integer a2 = 128;
    Integer b2 = 128;
    if(a2==b2){
        System.out.println("a2和b2相等");
    }else{
        System.out.println("a2和b2不等");
    }

    int a3 = 127;
    int b3 = 127;
    if(a3==b3){
        System.out.println("a3和b3相等");
    }else{
        System.out.println("a3和b3不等");
    }

    int a4 = 128;
    int b4 = 128;
    if(a4==b4){
        System.out.println("a4和b4相等");
    }else{
        System.out.println("a4和b4不等");
    }
    if(a2==a4){
        System.out.println("a2和a4相等");
    }else{
        System.out.println("a4和a4不等");
    }
    if(b2==a4){
        System.out.println("b2和a4相等");
    }else{
        System.out.println("b4和a4不等");
    }
}

运行结果是:
a1和b1相等
a2和b2不等
a3和b3相等
a4和b4相等
a2和a4相等
b2和a4相等

测试了下,两个Integer大于或等于128时是不等的。

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

对于Integer来说,你用==比较的是对象引用地址,而不是Integer的值。Integer你要把当当成一个对象来看待

要比较两个Integer类型的大小可以调用它的intValue方法 Long 对应的是longValue,这个其实在api就是调用强转的方法

所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。

个人总结:

1、“==”可以比较基础数据类型(8种)和引用数据类型, 而equals只能比较引用数据类型
2、“==”比较引用数据类型为数字类型时,超过常量池范围,则地址会不一样,需要使用equal判断是否相等
3、equals比较引用数据类型分两种,看equals是否被重写,如果没有被重写,则比较的是地址等同于“==”,如果被重写则比较的是内容
4、根据Object.hashCode的通用约定,如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果, 所以重写equals必须要重hashcode方法
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值