一、
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
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;
}
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;
}
public int hashcode(){
return this.getId()+100;
}
}
制定hashcode生成是 id + 100 .
一般有这么一个规定:
两个object
如果 equals() 相等,他们的hashcode也相等;如果equals()不相等,他们的hashcode不一定相等或者不等;他们的hashcode相等或者不等也决定不了equals()相等或者不等。
重写hashCode是为了集合类存储这些对象的时候有个比较规则
比如Map不允许重复元素,就是通过hashCode来检测的
这就是为什么复写equals()时候也要复写hashcode()。如果不一同复写,equals()比较两个对象相等,但hashcode是产生的不等,在使用hashmap 等 集合类索引就会出问题。
分享到:
相关推荐
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的...
如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同!!!! 如果两个对象不同(即用equals比较返回false),那么它们的hashCode值可能相同也可能不同。 如果两个对象的hashCode相同...
如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合
解析Java对象的equals()和hashCode()的使用
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点我们一会再谈。 那么我们还是单独来看hashCode(),为什么HashMap需要用到...
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
2、为什么改写equals()的时候,总是要改写hashCode() 两个原则: hashCode()的返回值和equals()的关系如下: 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。 如果x.equals(y)返回...
Object 类是所有类的父类,其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。他们都是通过比较地址来比较对象是否相等的
Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。
equals方法比较对象的是否相同 ==比较两个对象的内存地址 如果想表示对象的内容相同,返回true,则重写此方法 hashCode 返回一个hash code码,Integer,内存地址有关的hash算法 如果equal返回true的话,hashCode...
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 hashCode 的常规协定是: 在Java应用程序执行期间,在同一对象上多次调用 hashCode 方法...
为什么重写 equals() 时必须重写 hashCode() 方法? String String、StringBuffer、StringBuilder 的区别? String 为什么是不可变的? 字符串拼接用“+” 还是 StringBuilder? String#equals() 和 Object#equals() ...
equals(父类是object,所以每个对象都会有equals): ojbect的 (源代码的149行):出厂默认的话equals等价于 == string 类重写equals:比较的是每一个字符是否相等 hashCode(重写equals就一定要重写hashCode...