`

两种简单的方式快速实现hashCode 和 equals方法

    博客分类:
  • Java
 
阅读更多

http://hi.baidu.com/coolcat_police/item/8d248d02289a9bef359902a6

 

我们在写domain model类, 有时候需要重写hashCode和equals,以便可以把这个类当成List或者Map的Key来用。

    有两种方法可以很方便地去帮我们实现:

1. 使用eclipse工具。右击代码->Source->Generate hashCode and equals()...

    eclispe会根据你的model类里面的属性,帮你生成hashCode和equals方法,例如

public class Test implements Serializable {

private String id;

 

private String name;

 

public String getId() {

return id;

}

 

public void setId(String id) {

this.id = id;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((id == null) ? 0 : id.hashCode());

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

 

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Test other = (Test) obj;

if (id == null) {

if (other.id != null)

return false;

}

else if (!id.equals(other.id))

return false;

if (name == null) {

if (other.name != null)

return false;

}

else if (!name.equals(other.name))

return false;

return true;

}

 

}

 

 

2. 如果觉得hashCode和equals方法看上去不够简洁,可以使用org.apache.commons.lang.builder.HashCodeBuilder和org.apache.commons.lang.builder.EqualsBuilder

public class Test implements Serializable {

private String id;

 

private String name;

 

public String getId() {

return id;

}

 

public void setId(String id) {

this.id = id;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

@Override

public int hashCode() {

return new HashCodeBuilder().append(this.id).append(this.name)

.toHashCode();

}

 

@Override

public boolean equals(Object obj) {

if (!(obj instanceof Test)) {

return false;

}

 

Test o = (Test) obj;

 

return new EqualsBuilder().append(this.id, o.id).append(this.name,

o.name).isEquals();

}

}

 

----------------------------------------------------------------------------------------------------------

 

this is another example:

 

  1. public class Student {  
  2.     private int age;  
  3.     private String name;  
  4.     public Student() {  
  5.     }  
  6.     public Student(int age, String name) {  
  7.         super();  
  8.         this.age = age;  
  9.         this.name = name;  
  10.     }  
  11.     public int getAge() {  
  12.         return age;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setAge(int age) {  
  18.         this.age = age;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     @Override  
  24.     public int hashCode() {  
  25.         final int prime = 31;  
  26.         int result = 1;  
  27.         result = prime * result + age;  
  28.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  29.         System.out.println("hashCode : "+ result);  
  30.         return result;  
  31.     }  
  32.     @Override  
  33.     public boolean equals(Object obj) {  
  34.         if (this == obj)  
  35.             return true;  
  36.         if (obj == null)  
  37.             return false;  
  38.         if (getClass() != obj.getClass())  
  39.             return false;  
  40.         Student other = (Student) obj;  
  41.         if (age != other.age)  
  42.             return false;  
  43.         if (name == null) {  
  44.             if (other.name != null)  
  45.                 return false;  
  46.         } else if (!name.equals(other.name))  
  47.             return false;  
  48.         return true;  
  49.     }  
  50.       
分享到:
评论

相关推荐

    详解hashCode()和equals()的本质区别和联系

    主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下。

    java面试题.docx

    两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象...

    AIC的Java课程1-6章

     通过扩展类和实现接口两种方式定义匿名内部类。 机动时间和复习 2课时 <br> 第8章 异常和断言 4课时  理解异常和错误处理的概念。  学习使用throw,throws检测抛出...

    vals:来自标准Java接口的可扩展的不可变值对象

    该实现是不可变的,并基于定义的属性实现toString,equals和hashCode。 @Val接口可以使用命名约定来否决默认的hashCode,equals和toString方法。 除非方法为@ javax.annotation.Nullable,否则在构造/

    Java 最常见的 208 道面试题:第一模块答案

    两个对象的 hashCode()相同,则 equals()也一定为 true,对 吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5) 等于多少? String 属于基础的数据类型吗? java 中操作字符串都有哪些类?它们之间有...

    【05-面向对象(下)】

    •接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。 接口与抽象类的区别 •接口里只能包含抽象方法,不同包含已经提供实现的方法;抽象类则完全可以包含普通...

    史上最全java面试,103项重点知识,带目录

    3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 3 4. final 在 java 中有什么作用? 4 5. java 中的 Math.round(-1.5) 等于多少? 4 6. String 属于基础的数据类型吗? 4 7. java 中操作字符串都...

    JAVA基础课程讲义

    equals和hashcode方法 143  泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...

    Java面试经典题,对JAVA面试很有帮助

    16.Java创建对象有几种方式 17.有没有可能两个不相等的对象有相同的hashcode 18.深拷贝和浅拷贝的区别是什么 19.final有哪些用法 20.static都有哪些用法 21.3*0.1 == 0.3返回值是什么 22.a=a+b与a+=b有什么区别吗 23...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

    Java常见面试题208道.docx

    3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们...

    去年秋招整理了这份后端开发的核心面试题(偏Java),顺利拿到了腾讯offer,决定把它贡献出来

    前言 2019年为了秋招,精挑细学了这一份面试题,并且只挑重点和难点,此次整理包括 Java、数据结构与算法、计算机网络、操作系统、数据库等。如果你能把这些面试题都...java中==和equals和hashCode的区别 int与integ

    sesvc.exe 阿萨德

    众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。 Base 1.7 1.7 中的数据结构图: 先来看看 1.7 中的实现。 这是 HashMap 中比较核心的几个成员变量;看看分别是...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...

    别让Hibernate偷走了您的身份

    为了解决这个问题,您可能采取的措施是在持久性对象中实现equals()和hashCode(),可是要恰当地实现这两个方法比乍看之下要有技巧一些。让问题更糟糕的是,那些传统的思路(包括Hibernate官方文档所提倡的)对于新的...

    javaSE代码实例

    14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 SortedSet接口与TreeSet类 292 14.6.6 自定义满足Sorted集合的类 293 14.6.7 定制SortedSet的排序规则 296 14.6...

Global site tag (gtag.js) - Google Analytics