EqualsBuilder和HashCodeBuilder(重写equal和hashcode)
自动化hashCode()和equals()
问题产生:当需要自动实现hashCode()和equals()方法
解决方法:使用EqualsBuilder和HashCodeBuilder
使用举例:
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
public class PoliticalCandidate {
// Member variables - omitted for brevity
// Constructors - omitted for brevity
// get/set methods - omitted for brevity
// A hashCode which creates a hash from the two unique identifiers
public int hashCode( ) {
return new HashCodeBuilder( 17 , 37 )
.append(firstName)
.append(lastName).toHashCode( );
}
// An equals which compares two unique identifiers
public boolean equals(Object o) {
boolean equals = false ;
if ( o != null && PoliticalCandidate. class .isAssignableFrom(o) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
equals = ( new EqualsBuilder( )
.append(firstName, ps.firstName)
.append(lastName, ps.lastName)).isEquals( );
}
return equals;
}
} 
Discussion:
1.在上述例子中,当有相同的firstname和lastname时,认为两个对象的hashCode相同,从而equals()返回true.
如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。
public int hashCode( ) {
return HashCodeBuilder.reflectionHashCode( this );
}和ToStringBuilder 与 HashCodeBuilder一样EqualsBuilder 也是使用append()方法进行配置, EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法,EqualsBuilder会依次比较数组中的每个元素。
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现:
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals( this , o);
}问题提出:需要快速实现compareTo()方法
解决方法:使用CompareToBuilder提供的compareTo()方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法,用于比较两个对象所有的非static和非transient成员变量。
import org.apache.commons.lang.builder.CompareToBuilder;
// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);
}Discussion: CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量,因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。
public class PoliticalCandidate {
// Static variable
private static String averageAge;
// Member variables
private String firstName;
private String lastName;
private transient String fullName;
// Constructors
// get/set methods
// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);
}
}比较对象成员变量的时候应该有一个比较的次序存在,上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中,并且遵循后加入的先比较的次序。
例如:
public int compareTo(Object o) {
int compare = - 1 ; // By default return less-than
if ( o != null && PoliticalCandidate. class .isAssignableFrom( o.getClass( ) ) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
compare = ( new CompareToBuilder( )
.append(firstName, pc.firstName)
.append(lastName, pc.lastName)).toComparison( );
}
return compare;
}在比较的时候会先比较lastName,只有在lastName相同的情况下才会比较firstName。
ps:实现compareTo()的时候应保证和equals()规则相同,即当compareTo()返回是0的时候equals()应该返回true。
1.1 ReflectionToStringBuilder
本笔记是在阅读Jakarta Commons Cookbook时所留下的。
1.使用ReflectionToStringBuilder 或者ToStringBuilder 自动产生toString()的内容。
使用举例:假设有一个表征校长候选人信息的javabean-PoliticalCandidate。
public class PoliticalCandidate {
private String lastName;
private String firstName;
private Date dateOfBirth;
private BigDecimal moneyRaised;
private State homeState;
// get/set方法省略
public void toString( ) {
ReflectionToStringBuilder.toString( this );
}
}该bean里面有个toString()方法,假设有以下操作:
// Create a State
State va = new State( "VA", "Virginia");
// Create a Birth Date
Calendar calendar = new GregorianCalendar( );
calendar.set( Calendar.YEAR, 1743 );
calendar.set( Calendar.MONTH, Calendar.APRIL );
calendar.set( Calendar.DAY_OF_MONTH, 13 );
Date dob = calendar.getTime( );
BigDecimal moneyRaised = new BigDecimal( 293829292.93 ); 
// Create a Political Candidate
PoliticalCandidate candidate =
new PoliticalCandidate( "Jefferson", "Thomas", dob, moneyRaised, va );
System.out.println( candidate );
假设State对象也是一个使用ReflectionToStringBuilder的javabean,上述程序一种可能的输出为com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca
[lastName=Jefferson,\firstName=Thomas,
dateOfBirth=Sat Apr 13 22:38:42 CST 1743,
moneyRaised=\293829292.930000007152557373046875,
state=\com.discursive.jccook.lang.builders.State@87816d
[abbreviation=VA,name=Virginia]]
CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
EqualsBuilder – 用于辅助实现Object.equals()方法;
HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
ToStringBuilder – 用于辅助实现Object.toString()方法;
ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
ToStringStyle – 辅助ToStringBuilder控制输出格式;
StandardToStringStyle – 辅助ToStringBuilder控制标准格式。
自动化hashCode()和equals()
问题产生:当需要自动实现hashCode()和equals()方法
解决方法:使用EqualsBuilder和HashCodeBuilder
使用举例:
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
public class PoliticalCandidate {
// Member variables - omitted for brevity
// Constructors - omitted for brevity
// get/set methods - omitted for brevity
// A hashCode which creates a hash from the two unique identifiers
public int hashCode( ) {
return new HashCodeBuilder( 17 , 37 )
.append(firstName)
.append(lastName).toHashCode( );
}
// An equals which compares two unique identifiers
public boolean equals(Object o) {
boolean equals = false ;
if ( o != null && PoliticalCandidate. class .isAssignableFrom(o) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
equals = ( new EqualsBuilder( )
.append(firstName, ps.firstName)
.append(lastName, ps.lastName)).isEquals( );
}
return equals;
}
} 
Discussion:
1.在上述例子中,当有相同的firstname和lastname时,认为两个对象的hashCode相同,从而equals()返回true.
如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。
public int hashCode( ) {
return HashCodeBuilder.reflectionHashCode( this );
}和ToStringBuilder 与 HashCodeBuilder一样EqualsBuilder 也是使用append()方法进行配置, EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法,EqualsBuilder会依次比较数组中的每个元素。
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现:
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals( this , o);
}问题提出:需要快速实现compareTo()方法
解决方法:使用CompareToBuilder提供的compareTo()方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法,用于比较两个对象所有的非static和非transient成员变量。
import org.apache.commons.lang.builder.CompareToBuilder;
// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);
}Discussion: CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量,因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。
public class PoliticalCandidate {
// Static variable
private static String averageAge;
// Member variables
private String firstName;
private String lastName;
private transient String fullName;
// Constructors
// get/set methods
// Build a compareTo function from reflection
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare( this , obj);
}
}比较对象成员变量的时候应该有一个比较的次序存在,上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中,并且遵循后加入的先比较的次序。
例如:
public int compareTo(Object o) {
int compare = - 1 ; // By default return less-than
if ( o != null && PoliticalCandidate. class .isAssignableFrom( o.getClass( ) ) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
compare = ( new CompareToBuilder( )
.append(firstName, pc.firstName)
.append(lastName, pc.lastName)).toComparison( );
}
return compare;
}在比较的时候会先比较lastName,只有在lastName相同的情况下才会比较firstName。
ps:实现compareTo()的时候应保证和equals()规则相同,即当compareTo()返回是0的时候equals()应该返回true。
1.1 ReflectionToStringBuilder
本笔记是在阅读Jakarta Commons Cookbook时所留下的。
1.使用ReflectionToStringBuilder 或者ToStringBuilder 自动产生toString()的内容。
使用举例:假设有一个表征校长候选人信息的javabean-PoliticalCandidate。
public class PoliticalCandidate {
private String lastName;
private String firstName;
private Date dateOfBirth;
private BigDecimal moneyRaised;
private State homeState;
// get/set方法省略
public void toString( ) {
ReflectionToStringBuilder.toString( this );
}
}该bean里面有个toString()方法,假设有以下操作:
// Create a State
State va = new State( "VA", "Virginia");
// Create a Birth Date
Calendar calendar = new GregorianCalendar( );
calendar.set( Calendar.YEAR, 1743 );
calendar.set( Calendar.MONTH, Calendar.APRIL );
calendar.set( Calendar.DAY_OF_MONTH, 13 );
Date dob = calendar.getTime( );
BigDecimal moneyRaised = new BigDecimal( 293829292.93 ); 
// Create a Political Candidate
PoliticalCandidate candidate =
new PoliticalCandidate( "Jefferson", "Thomas", dob, moneyRaised, va );
System.out.println( candidate );
假设State对象也是一个使用ReflectionToStringBuilder的javabean,上述程序一种可能的输出为com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca
[lastName=Jefferson,\firstName=Thomas,
dateOfBirth=Sat Apr 13 22:38:42 CST 1743,
moneyRaised=\293829292.930000007152557373046875,
state=\com.discursive.jccook.lang.builders.State@87816d
[abbreviation=VA,name=Virginia]]
CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
EqualsBuilder – 用于辅助实现Object.equals()方法;
HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
ToStringBuilder – 用于辅助实现Object.toString()方法;
ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
ToStringStyle – 辅助ToStringBuilder控制输出格式;
StandardToStringStyle – 辅助ToStringBuilder控制标准格式。
EqualsBuilder和HashCodeBuilder(重写equal和hashcode)的更多相关文章
- java 如何重写equal 和hashcode方法(最佳实践)
先看完理解这篇:Java hashCode() 和 equals()的若干问题解答 实现高质量的equals方法的诀窍包括 使用==操作符检查“参数是否为这个对象的引用”: 使用instanceof操 ...
- 重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) ...
- 如何正确的重写equals() 和 hashCode()方法
比较两个Java对象时, 我们需要覆盖equals和 hashCode. public class User{ private String name; private int age; priva ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- EqualsBuilder和HashCodeBuilder
package com.osc.demo; import java.util.List; import org.apache.commons.lang.builder.EqualsBuilder; i ...
- Java中equals()和hashCode()的关系以及重写equals()和hashCode()的重要性
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6580647.html 一:关系 如果两个对象相等(equal),它们的hashcode一定相同: 如果两个对 ...
- 为什么要重写equals和hashcode方法
equals hashcode 当新建一个java类时,需要重写equals和hashcode方法,大家都知道!但是,为什么要重写呢? 需要保证对象调用equals方法为true时,hashcode ...
- 为什么要同时重写equals和hashcode
原文地址https://blog.csdn.net/tiantiandjava/article/details/46988461 原文地址https://blog.csdn.net/lijiecao0 ...
- Java:重写equals()和hashCode()
Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...
随机推荐
- The Moving Points
Problem Description There are N points in total. Every point moves in certain direction and certain ...
- S3C2440触摸屏驱动实例开发讲解
出处:http://www.embeddedlinux.org.cn/html/yingjianqudong/ 一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--6 ...
- VMWare虚拟机USB连接问题
错误31:连接到系统上的设备没有发挥作用 原文链接 描述 常用 VMware 虚拟机的有事应该遇到这种情况,就是装完 VMware ,启动时 VMware 下面会有个黄框中有" USB di ...
- HW4.1
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- CentOS搭建VSFTP
1.先看看有没有安装 rpm -qa | grep vsftpd 如果没有提示,说明没有安装.接下来,我们安装一个ftp. 2.yum安装vsftpd: yum -y install vsftpd 安 ...
- vc++ CreateFile报错,返回123
//hFile = CreateFile("D:\dev\fmt\res\face1.png", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, ...
- mybatis generator 使用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- zend studio-字体大小设置
在使用zend studio的过程中为了方便我们编码,很多时候需要设置编码的字体的大小,设置步骤如下: 选择[Windows]-[preference]-[general]-[appearance]- ...
- 用sp_addlinkedserver建立链接服务器(sql server2008中通过测试)
--在SQL SERVER 2008里,可以按以下的方式建立链接服务器 ? EXEC sp_addlinkedserver @server='Test',--这里是给链接服务器取的 ...
- js获取浏览器类型
function add(){ var userAgent = navigator.userAgent, rMsie = /(msie\s|trident.*rv:)([\w.]+)/, rFiref ...