equals、==和hashCode有什么区别

正文1(equal与==)

1.==解读

java中的数据类型,可分为两类:

1.基本数据类型,也称原始数据类型,有byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。

2.引用类型(类、接口、数组)

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见’=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。

2.==与equals的不同之处

1.功能不同

"=="是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。

最令大家疑惑的可能是这个,这个例子将完美诠释上边的说法:
在这里插入图片描述
原因是因为:

String s1="hello";  //是在字符串常量池中开辟了内存空间
String s2=new String("hello");//在堆中开辟了内存空间
他两自然指向的内存空间不是一个
2.定义不同
  1. equals():是Java超类Object中的方法。

  2. "=="在Java中只是一个运算符合。

3.运行速度不同
  1. equals():没有==运行速度快。
  2. 运行速度比equals()快,因为只是比较引用。

正文2(equals与hashcode)

1.hashCode解读

  • hashCode是用来鉴定两个对象是否相等,Object类中的hashCode方法返回对象在内存中地址转换成的一个int值,所以如果没有重写hashCode方法时,任何对象的hashCode方法都是不相等的。
  • 设计hashCode()的一个因素是:对同一个对象调用hashCode都应该产生同一个值。hash码的主要用途是在对对象进行散列的时候作为key输入,我们需要每个对象的hash码尽可能不同这样才能保证散列的存取性能。
  • 所有的散列函数都有这样的一个特性:
    1.如果a==b,则hash(a)==hash(b)
    2.如果a!=b,则hash(a)可能得到与hash(b)相同的散列值
  • hashCode的作用:
    在这里插入图片描述

2.equals解读

equals()方法特点:

  1. 自反性:x.equals(x)返回true;

  2. 对称性:若x.equals(y)为true,则y.equals(x)亦为true;

  3. 传递性:若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;

  4. 一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;

  5. 对于非空引用x,x.equals(null)永远返回为false。

3.hashCode与equals不同之处

  1. 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
  2. 如果两个对象不equals,他们的hashcode有可能相等。
  3. 如果两个对象hashcode相等,他们不一定equals。
  4. 如果两个对象hashcode不相等,他们一定不equals。
  5. 若重写equals(Object obj)方法,必须重写其hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值