==和equals的区别,如果重写了equals()不重写hashCode()会发生什么?

  1. ==是操作符,会返回一个boolean类型的值,用于计算两个操作数的值的关系。
  2. equals是Object的实例方法,用于比较两个对象的内容是否相同。
  3. hashcode()是Object的native方法,他会获取一个对象的hash值,返回一个整型值,用于表示该对象在哈希表中索引位置。
“==”:为关系操作符

对于8个基本类型:整型:byte,short,int,long 浮点数:float,double 布尔类型:boolean 字符类型:char。变量直接存储其需要表示的值,关系操作符可以直接判定两个变量的值是否相等。

对于引用类型的变量,变量中存储的是对象在内存中的地址。因而关系操作符只能判断两个引用型变量是否引用同一个对象。

equals:实例方法

Object类中有equals方法的基本实现:

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

可见,Object类中equals方法是判定两个引用型变量是否指向同一个对象。但是对于类似于String的非基本类型,equals方法可以判断两个引用型变量所引用对象的内容是否相同。这是因为,java中所有的非基本类型都继承了Object类,因此他们重写了equals方法。所以我们说,equals方法是非基本类型的实例方法,可以判断引用型变量所指向的对象的内容是否相同。一般而言,其判断步骤分为如下三步:

(1) 先判断两个引用型变量是否指向同一对象;

(2) 若不是,再判断两个引用型变量的类型是否一致;

(3) 若是,再判断两个对象的内容的是否一致。

equals需要满足:对称性、自反性、一致性、传递性(类推性)。

hashcode:native方法

hashcode方法是Object类中的native方法,所有继承Object的类型都会有该方法。native方法是指在java外部用其他语言实现的方法。在hashcode的使用中,有一些规范:

(1) 在java程序的执行期间,对同一对象多次调用hashcode方法,返回的整数必须是一致相同的,前提是对该对象进行equals比较时所用的参数没有改变。从同一程序的一次执行,到该程序的另一次执行,该整数无需一致。

(2) 如果根据equals方法,两个对象是相等的,那么这两个对象的hashcode返回的整数必须是相同的。

(3) 如果根据equals方法,两个对象不相等,那么这两个对象的hashcode返回的整数不一定不相同,但是我们应该明白,不同的对象拥有不同的hashcode有利于提升哈希表的性能。

并且,hashcode和equals存在如下关系:

(1) 若两个对象根据equals是相等的,那么他们两个的hashcode一定是相同。

(2) 如果两个对象的hashcode是相同的,那么这两个对象不一定相等。

(3) 如果两个对象的hashcode不同,那么这两个对象一定不相等。

(4) 一般来讲,equals方法是给用户调用的,而hashcode方法用户一般不会调用。

(5) 如果一个对象类型作为集合对象的元素时,那么这个对象一定要有自己的equals和hashcode实现,并且要遵循上述规则。

因此,若我们重写equals方法,而不重写hashcode,那么equals方法可能会失效。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值