例如下述java类:

import java.io.serializable;
import java.util.list;

public class bean_topology implements serializable {
 private static final long serialversionuid = 1l;
 public static long getserialversionuid() {
  return serialversionuid;
 }

 private long topology_pk;

 private string topology_id;

 public string gettopology_id() {
  return topology_id;
 }

 public void settopology_id(string topology_id) {
  this.topology_id = topology_id;
 }

 public long gettopology_pk() {
  return topology_pk;
 }

 public void settopology_pk(long topology_pk) {
  this.topology_pk = topology_pk;
 }

 @override
 public string tostring() {
  return "当前拓扑的pk为:" + topology_pk + ",id为:" + topology_id;
 }
}

如下想判断下面两个对象中全部属性值是否一致时,有哪些办法呢?

bean_topology topology1 = new bean_topology();
 topology1.settopology_id("1");

bean_topology topology2 = new bean_topology();
 topology2.settopology_pk(1l);
 topology2.settopology_id("1");

方法一:重写bean_topology的equals方法和hashcode方法,代码如下:

@override
public boolean equals(object obj) {
    if (this == obj) {
        return true;
    }
  
    if (obj == null || getclass() != obj.getclass()) {
        return false;
     }

    bean_topology topology = (bean_topology) obj;
    if (topology_pk == null) {
        if (topology.topology_pk != null) {
            return false;
        } 
    }else if (!topology_pk.equals(topology.topology_pk)) {
        return false; 
    }
        
    if (topology_id == null) {
        if (topology.topology_id != null) {
            return false;
        } 
    }else if (!topology_id.equals(topology.topology_id)) {
        return false; 
    }
        
        return true;
    }
 
    @override
    public int hashcode() {
        return  topology_pk.hashcode()+topology_id.hashcode();
    }

测试代码如下:

if(topology1.equals(topology2)) {
 system.out.println("对象1与对象2的属性值无差异。");
}else {
 system.out.println("对象1与对象2的属性值有差异。"); 
}

输出结果为:

对象1与对象2的属性值有差异。

方法二:调用文章末尾的工具类,代码如下:

map<string, map<string,object>> resultmap=comparefields(topology1,topology2);
int size=resultmap.size();
if(size>0) {
    system.out.println("对象1与对象2的属性值有差异,差异结果如下:");
  
    iterator<string> it = resultmap.keyset().iterator();
    while(it.hasnext()) {
        string key=it.next();
        system.out.println("  "+key+"(oldvalue:"+resultmap.get(key).get("oldvalue")+",newvalue:"+resultmap.get(key).get("newvalue")+")");
        } 
}else {
 system.out.println("对象1与对象2的属性值无差异!");
}

输出结果为:

对象1与对象2的属性值有差异,差异结果如下:
  topology_pk(oldvalue:null,newvalue:1)

工具类如下:

package com.sitech.modual.util.compare;

import java.beans.introspector;
import java.beans.propertydescriptor;
import java.lang.reflect.method;
import java.sql.timestamp;
import java.util.arraylist;
import java.util.date;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;

import com.sitech.modual.bean.bean_link;
import com.sitech.modual.bean.bean_topology;

public class classcompareutil {
 /**
  * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
  * @param oldobject 进行属性比较的对象1
  * @param newobject 进行属性比较的对象2
  * @return 属性差异比较结果boolean
  */
 public static boolean compareobject(object oldobject, object newobject) {
  map<string, map<string,object>> resultmap=comparefields(oldobject,newobject);
  
  if(resultmap.size()>0) {
   return false;
  }else {
   return true;
  }
 }
 
 /**
  * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个map分别存oldobject,newobject此属性名的值
  * @param oldobject 进行属性比较的对象1
  * @param newobject 进行属性比较的对象2
  * @return 属性差异比较结果map
  */
 @suppresswarnings("rawtypes")
 public static map<string, map<string,object>> comparefields(object oldobject, object newobject) {
  map<string, map<string, object>> map = null;
  
  try{ 
   /**
    * 只有两个对象都是同一类型的才有可比性
    */
   if (oldobject.getclass() == newobject.getclass()) {
    map = new hashmap<string, map<string,object>>();
    
    class clazz = oldobject.getclass();
    //获取object的所有属性
    propertydescriptor[] pds = introspector.getbeaninfo(clazz,object.class).getpropertydescriptors();
    
    for (propertydescriptor pd : pds) {
     //遍历获取属性名
     string name = pd.getname();
     
     //获取属性的get方法
     method readmethod = pd.getreadmethod();
     
     // 在oldobject上调用get方法等同于获得oldobject的属性值
     object oldvalue = readmethod.invoke(oldobject);
     // 在newobject上调用get方法等同于获得newobject的属性值
     object newvalue = readmethod.invoke(newobject);
     
     if(oldvalue instanceof list){
      continue;
     }
     
     if(newvalue instanceof list){
      continue;
     }
     
     if(oldvalue instanceof timestamp){
      oldvalue = new date(((timestamp) oldvalue).gettime());
     }
     
     if(newvalue instanceof timestamp){
      newvalue = new date(((timestamp) newvalue).gettime());
     }
     
     if(oldvalue == null && newvalue == null){
      continue;
     }else if(oldvalue == null && newvalue != null){
      map<string,object> valuemap = new hashmap<string,object>();
       valuemap.put("oldvalue",oldvalue);
       valuemap.put("newvalue",newvalue);
      
      map.put(name, valuemap);
      
      continue;
     }
     
     if (!oldvalue.equals(newvalue)) {// 比较这两个值是否相等,不等就可以放入map了
      map<string,object> valuemap = new hashmap<string,object>();
       valuemap.put("oldvalue",oldvalue);
       valuemap.put("newvalue",newvalue);
      
      map.put(name, valuemap);
     }
    }
   }
  }catch(exception e){
   e.printstacktrace();
  }
  
  return map;
 }
}

注意:本工具类不适用于比较包含list,map等类的class。

到此这篇关于java比较两个对象中全部属性值是否相等的方法的文章就介绍到这了,更多相关java比较对象属性值内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!