isAssignableFrom()方法是从类继承的角度去判断,instanceof()方法是从实例继承的角度去判断。
isAssignableFrom()方法是判断是否为某个类的父类,instanceof()方法是判断是否某个类的子类。

1. Class.isAssignableFrom()方法
Class.isAssignableFrom()是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的子类或接口。
格式为:
Class1.isAssignableFrom(Class2)
调用者和参数都是java.lang.Class类型。

2.Class.instanceof()方法
Class.instanceof()是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
格式是:
obj instanceof TypeName
第一个参数是对象实例名,第二个参数是具体的类名或接口名,例如 String,InputStream。其返回值为boolean。

        System.out.println("String是Object的父类:"+String.class.isAssignableFrom(Object.class));//false
System.out.println("Object是String的父类:"+Object.class.isAssignableFrom(String.class));//true
System.out.println("Object和Object相同:"+Object.class.isAssignableFrom(Object.class));//true String str = "";
System.out.println("str是Object的实例:"+str instanceof Object);//true
Object o = new Object();
System.out.println("o是Object的实例:"+o instanceof Object);//true
package com.osc.demo;

import java.util.List;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder; public class Teacher {
private String name;
private int age;
private List<Student> student; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public List<Student> getStudent() {
return student;
} public void setStudent(List<Student> student) {
this.student = student;
} @Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
} @Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
package com.osc.demo;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder; public class Student {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
} @Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
package com.osc.demo;

import java.util.ArrayList;
import java.util.List; public class Test {
public static void main(String[] args) {
Student studentOne = new Student();
studentOne.setName("张柏芝");
studentOne.setAge(34);
List<Student> listOne = new ArrayList<Student>();
listOne.add(studentOne);
Teacher teacherOne = new Teacher();
teacherOne.setName("陈冠希");
teacherOne.setAge(33);
teacherOne.setStudent(listOne); Student studentTwo = new Student();
studentTwo.setName("张柏芝");
studentTwo.setAge(34);
List<Student> listTwo = new ArrayList<Student>();
listTwo.add(studentTwo);
Teacher teacherTwo = new Teacher();
teacherTwo.setName("陈冠希");
teacherTwo.setAge(33);
teacherTwo.setStudent(listTwo); System.out.println(teacherOne == teacherTwo);
System.out.println(teacherOne.equals(teacherTwo));
}
}

false

true

https://my.oschina.net/moxia/blog/308548

自动化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]]

org.apache.commons.lang.builder
  CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
  
  EqualsBuilder – 用于辅助实现Object.equals()方法;
  
  HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
  
  ToStringBuilder – 用于辅助实现Object.toString()方法;
  
  ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
  
  ToStringStyle – 辅助ToStringBuilder控制输出格式;
  
  StandardToStringStyle – 辅助ToStringBuilder控制标准格式。

http://www.blogjava.net/19851985lili/articles/95448.html

EqualsBuilder和HashCodeBuilder的更多相关文章

  1. EqualsBuilder和HashCodeBuilder(重写equal和hashcode)

    EqualsBuilder和HashCodeBuilder 自动化hashCode()和equals()  问题产生:当需要自动实现hashCode()和equals()方法  解决方法:使用Equa ...

  2. How to implement equals() and hashCode() methods in Java[reproduced]

    Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...

  3. Spring实战5:基于Spring构建Web应用

    主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...

  4. override equals in Java

    equals() (javadoc) must define an equality relation (it must be reflexive, symmetric, and transitive ...

  5. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  6. 如何正确的重写equals() 和 hashCode()方法

    比较两个Java对象时, 我们需要覆盖equals和  hashCode. public class User{ private String name; private int age; priva ...

  7. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  8. SpringMVC 全注解实现 (1) servlet3.0以上的容器支持

    一. Spring MVC入门 1.1 request的处理过程 用户每次点击浏览器界面的一个按钮,都发出一个web请求(request).一个web请求的工作就像一个快递员,负责将信息从一个地方运送 ...

  9. Spring实战5-基于Spring构建Web应用

    主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右工作经验的人,这篇文章的作者用精练 ...

随机推荐

  1. java多线程总结四:volatile、synchronized示例

    1.synchronized保证同步 先看一个生成偶数的类 <span style="font-size:16px;">package demo.thread; /** ...

  2. mac配置svn服务器

    1创建svn库:mudydeMacBook-Air:~ mudy$   svnadmin create /Users/mudy/svn   2进行配置,配置我们的svn a.将svnsever.con ...

  3. spring.net 和 mybatis.net

    demo是整合现有的spring.net 和 mybatis.net 完成的控制台程序,需要注意的地方:关于Config文件夹中的config文件的属性设定:同时保证Providers.config默 ...

  4. C 语言 查找一个字符串2在字符串1中出现的次数

    #include <stdio.h> #include <windows.h> int main() { ], b[]; char *temp; ; memset( a, ); ...

  5. java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

    /* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...

  6. Java JDK1.5、1.6、1.7新特性整理(转)

    原文链接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html 一.Java JDK1.5的新特性 1.泛型: List<String& ...

  7. OpenJudge 2802 小游戏 / Poj 1101 The Game

    1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...

  8. ThinkPHP3.2 加载过程(四)

    前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线= ...

  9. Python3 多进程和多线程

    Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...

  10. C# 链表操作

    关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...