`
农村哥们
  • 浏览: 292605 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多
一、
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 等 集合类索引就会出问题。
分享到:
评论
1 楼 小牛100 2016-01-02  
不错,明白了

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    equals与hashCode方法讲解

    equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个...== 号比较的是对象的内存地址,equals 方法比较的是对象的内容,而 hashcode 方法则是用来唯一标识一个对象的。

    Java中的equals和hashCode方法详解1

    如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...

    java中hashcode()和equals()方法详解

    - 相反,如果两个对象的`hashCode()`值相同,并不能保证这两个对象通过`equals()`方法比较也是相等的。这是因为可能存在不同的对象具有相同的哈希值,这种情况称为哈希冲突。 - 为了避免哈希冲突带来的性能问题,在...

    关于重写equals,hashcode以及compareTo方法!

    equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,我们需要重写equals()方法,使其比较对象的实际...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    Java_重写equals()和hashCode()

    总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的逻辑以及使用哈希表的数据结构的效率。通过遵循上述原则和最佳实践,我们可以确保对象的比较行为...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    深入 HashCode 方法~

    - 同等性原则:如果两个对象相等(根据 `equals()` 方法判断),那么它们的 `HashCode` 必须相同。 - 一致性原则:同一个对象在不同时间调用 `hashCode()` 方法应该返回相同的值,除非对象的状态发生改变。 #### ...

    Java重写equals及hashcode方法流程解析

    在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    set接口经常用的hashCode和equals方法详解

    - **性能考虑**: 为了提高性能,只有当两个对象的`hashCode`相同的情况下,才会调用`equals`方法进行深度比较。 - **一致性要求**: `equals`方法需要满足对称性、反射性、传递性和一致性等性质,以确保集合操作的...

    关于hashCode()和equals()的本质区别和联系

    Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

Global site tag (gtag.js) - Google Analytics