点击关注公众号,实用技术文章及时了解

来源:xiaoer.blog.csdn.net/article/details/85005295

例如下述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;}@Overridepublic 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;}@Overridepublic 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。

●【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能

●分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!

●能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

Java:比较两个对象中全部属性值是否相等相关推荐

  1. 比较两个对象中全部属性值是否相等

    重写Bean_Topology的equals方法和hashcode方法 @Override public boolean equals(Object obj) {if (this == obj) {r ...

  2. vue双向绑定不生效、对象中的属性值发生改变页面不会重新渲染问题解决办法

    文章目录 vue双向绑定原理 方法一 增加一个基本类型的变量 方法二 使用整体对象替换 方法三 使用vue文档提供的方法 vue双向绑定原理 vue深入式响应原理,当我们在data中声明变量对象,Vu ...

  3. java通过反射获取对象的指定属性值(包括私有属性值和指定注解属性值)

    通过反射机制,可以灵活地根据对象的属性名的字符串形式获取对象的属性值.当一个对象有多个属性的时候,只需要对其中的几个特定属性进行某种特殊处理,具体是哪个属性并不能提前确定,每个需要处理的属性的方法也不 ...

  4. jQuery 根据数组对象中的属性值删除当前对象

    var data = form.serializeArray(); //**表单提交一般不用这个** removeByValue(data, 'name', '__VIEWSTATE'); remov ...

  5. python-往对象中添加属性值

    class Cat:pass 对象.属性 t = Cat() t.name = "张三" print(t.dict) 反射添加 setattr(t, "age" ...

  6. validity属性返回对象中的属性值

    转载于:https://www.cnblogs.com/rickdiculous/p/11469825.html

  7. js 修改数组对象中的属性值

    数据类型如下: var dataType=[{"type":"add",state":false},{"type":"u ...

  8. java中判断对象中某个属性是否为空

    问题:java对象接受从数据库查出来的数据时,对对象的某一属性进行操作,在操作属性中存储的数据中不对进行检查,会出现空指针异常的情况. 问题再现:新建一个实体类 public class Studen ...

  9. 实例对象的属性和原型对象中的属性重名问题 神奇的原型链 继承 继承案例

    实例对象的属性和原型对象中的属性重名问题 <!DOCTYPE html> <html lang="en"> <head><meta cha ...

最新文章

  1. hdu 4035 可能性DP 成都网络游戏
  2. 使用IDEA创建一个Servlet应用程序
  3. 15行代码AC——习题3-1 得分 (UVa1585,Score)
  4. linux ftp解压命令 cannot fid or open,Linux环境搭建及常用shell命令集锦
  5. 扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径
  6. 图管够!灌篮高手、女儿国…阿里日_这帮程序员太会玩了!
  7. Linux中文件复制、删除、移动、压缩、解压命令
  8. python中pop函数的用法_python中pop()函数怎么用
  9. Unity3d导出Lightingmap的方法
  10. SAP License:赛锐信息访谈启示录(四)
  11. 2021-2025年中国再加工医疗器械行业市场供需与战略研究报告
  12. Linux之磁盘挂载
  13. html input 文本框的一些操作(限制输入...)
  14. 保护你的眼睛,把电脑屏幕由白色改为淡绿
  15. sklearn+gensim︱jieba分词、词袋doc2bow、TfidfVectorizer
  16. P1113 杂务 拓扑排序
  17. Ralph and Mushrooms (tarjan+dp)
  18. Mybatis在xml文件中处理大于号小于号的方法
  19. C++ Qt 实现小游戏2048
  20. matlab距离变换,图像处理之距离变换

热门文章

  1. 马斯克:挑战纽北赛道的Model S配有7个座椅
  2. 真香!第一批国产人造肉亮相阿里食堂 员工表示味道很不错
  3. 苹果或将推出可折叠iPad:支持5G 对抗双屏Surface
  4. 一个女孩写的经典程序
  5. github常见操作和常见错误!
  6. 晨哥真有料丨太快得到是不是就不珍惜了?这锅,男生真的不背!
  7. 计算机怎么切换到音乐,电脑怎么换开关机背景音乐?电脑换开关机背景音乐的方法...
  8. 我的一些学习经验:ONVIF
  9. 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能
  10. 【java】线程 ExecutorService 原理 源码 解释