一、
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()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。
"关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...
equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个...== 号比较的是对象的内存地址,equals 方法比较的是对象的内容,而 hashcode 方法则是用来唯一标识一个对象的。
如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...
- 相反,如果两个对象的`hashCode()`值相同,并不能保证这两个对象通过`equals()`方法比较也是相等的。这是因为可能存在不同的对象具有相同的哈希值,这种情况称为哈希冲突。 - 为了避免哈希冲突带来的性能问题,在...
equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,我们需要重写equals()方法,使其比较对象的实际...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的逻辑以及使用哈希表的数据结构的效率。通过遵循上述原则和最佳实践,我们可以确保对象的比较行为...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
- 同等性原则:如果两个对象相等(根据 `equals()` 方法判断),那么它们的 `HashCode` 必须相同。 - 一致性原则:同一个对象在不同时间调用 `hashCode()` 方法应该返回相同的值,除非对象的状态发生改变。 #### ...
在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...
深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...
- **性能考虑**: 为了提高性能,只有当两个对象的`hashCode`相同的情况下,才会调用`equals`方法进行深度比较。 - **一致性要求**: `equals`方法需要满足对称性、反射性、传递性和一致性等性质,以确保集合操作的...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...