equals()对象的比较;hashcode()方法

本文详细解析了Java中字符串的比较方式,包括引用与值的对比,并深入探讨了Object类的equals()方法与hashcode()方法的工作原理及重写策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、
String s1 = "abc";
String s2 = "abc";
s1 == s2 true;
比较的是引用、物理地址。这样定义通过缓存机制,实际是只申请了一个内存地址,所以相等。

String s3 = new String("abc");
String s4 = new String("abc");
s3 == s4 false;
这样定义是申请了两个内存地址,所以不相等。

s1.equals(s2) true;
s3.equals(s4) true;

Object 存在equals()方法执行的是比较两个Object的内存地址。因为所有的类都继承Object,所以都隐藏包含着equals()方法比较内存地址。但String 类复写了equals() 方法,它的策略是比较value,s1,s2,s3,s4内存都是abc所以是相等。

对于一般的类都会复写equals()有自己的比较策略。当我们自己创建类时候,也同样需要复写equals()满足我们的业务要求。否则默认是比较对象的内存地址。
例如:
class vo {
private Integer id;
private Integer name;

public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
..........getName
..........setName

[color=red] public boolean equals(Object other){
if(this == other){
return true;
}
if(!(other instanceof vo)){
return false;
}
vo o = (vo)other;
return this.getId == o.getId;
}[/color]
public int hashcode(){
return this.getId()+100;
}
}
复写的 equals() 策略是如果两个object的 id 相等就认为两个对象是相等的,即使name不等。所以复写的方法完全按照自己的业务需求来制定。

按照国际惯例也要加上下面这段
在重写equals方法时,要注意满足离散数学上的特性

1、自反性 :对任意引用值X,x.equals(x)的返回值一定为true.
2 对称性: 对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false


二、
hashcode() 是创建对象自动生成的标识,为了索引等便利于快捷。
Object 类带有生成 hashcode 策略,每次new 一个新的对象都会生成一个不同的hashcode。应用在hashMap,hastTable 等地方为索引用。

当然也可以复写hashcode(),自己制定生成hashcode策略。
例如:
class vo {
private Integer id;
private Integer name;

public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
..........getName
..........setName

public boolean equals(Object other){
if(this == other){
return true;
}
if(!(other instanceof vo)){
return false;
}
vo o = (vo)other;
return this.getId == o.getId;
}

[color=red] public int hashcode(){
return this.getId()+100;
}[/color]
}
制定hashcode生成是 id + 100 .

一般有这么一个规定:
两个object [b]如果 equals() 相等,他们的hashcode也相等[/b];如果equals()不相等,他们的hashcode不一定相等或者不等;他们的hashcode相等或者不等也决定不了equals()相等或者不等。

重写hashCode是为了集合类存储这些对象的时候有个比较规则
比如Map不允许重复元素,就是通过hashCode来检测的
这就是为什么复写equals()时候也要复写hashcode()。如果不一同复写,equals()比较两个对象相等,但hashcode是产生的不等,在使用hashmap 等 集合类索引就会出问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值