18、实体类对象比对-JSON
2023-04-18 15:18:47 时间
实体类对象相互比较-JSON方式:
在实际开发中,我们经常需要比较同一个自定义类型的两个不同对象的属性值是否相等,采用JSON方式比较可快速有效实现相关需求。JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进行了封装,添加了很多方便快捷的属性方法。
1、相关依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.79</version> </dependency>
2、自定义JSON比较工具方法:
public static Boolean emtityToCompare(Object oldObject, Object newObject){ JSONObject jsonObject1 = JSONObject.parseObject(JSON.toJSONString(oldObject)); log.info("JSON对象1:{}",jsonObject1); JSONObject jsonObject2 = JSONObject.parseObject(JSON.toJSONString(newObject)); log.info("JSON对象2:{}",jsonObject2); if(ObjectUtils.isEmpty(jsonObject1) && ObjectUtils.isEmpty(jsonObject2)){ return true; }else { if(ObjectUtils.isEmpty(jsonObject1)){ return false; }else { return jsonObject1.equals(jsonObject2); } } }
3、验证:
(1)、声明实体类:
无重写hashCode()和 equals()方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class PropertiesVO{ private String type; private Integer cpu; private Integer ram; private Integer disk; public String getType() { return type; } public void setType(String type) { this.type = type; } public Integer getCpu() { return cpu; } public void setCpu(Integer cpu) { this.cpu = cpu; } public Integer getRam() { return ram; } public void setRam(Integer ram) { this.ram = ram; } public Integer getDisk() { return disk; } public void setDisk(Integer disk) { this.disk = disk; } }
(2)、test测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@Slf4j public class EntityDemo { public static void main(String[] args) { PropertiesVO propertiesVO = new PropertiesVO(); PropertiesVO propertiesVO1 = null; PropertiesVO propertiesVO2 = new PropertiesVO(); propertiesVO2.setType("0"); PropertiesVO propertiesVO3 = new PropertiesVO(); propertiesVO3.setType("0"); PropertiesVO propertiesVO4 = new PropertiesVO(); propertiesVO4.setType("1"); System.out.println(propertiesVO2.equals(propertiesVO3));//false,无重写hashCode()和 equals()方法 System.out.println(propertiesVO1.equals(propertiesVO));//NullPointerException空指针异常 System.out.println(emtityToCompare(propertiesVO1, propertiesVO));//true System.out.println(emtityToCompare(propertiesVO2, propertiesVO3));//true System.out.println(emtityToCompare(propertiesVO, propertiesVO2));//false System.out.println(emtityToCompare(propertiesVO3, propertiesVO4));//false } public static Boolean emtityToCompare(Object oldObject, Object newObject){ JSONObject jsonObject1 = JSONObject.parseObject(JSON.toJSONString(oldObject)); log.info("JSON对象1:{}",jsonObject1); JSONObject jsonObject2 = JSONObject.parseObject(JSON.toJSONString(newObject)); log.info("JSON对象2:{}",jsonObject2); if(ObjectUtils.isEmpty(jsonObject1) && ObjectUtils.isEmpty(jsonObject2)){ return true; }else { if(ObjectUtils.isEmpty(jsonObject1)){ return false; }else { return jsonObject1.equals(jsonObject2); } } } }
Java中==与equals()的区别:
1、==是运算符,用于比较两个变量是否相等;
2、equals()是Object类的方法,用于比较两个对象是否相等;
总结:
基本数据类型比较使用==,比较他们的值。默认情况下,当对象使用==比较时,比较的是内存地址,如果需要比较对象的内容,需要重写equal方法。
hashCode()和 equals()方法为什么要同时重写:
equals()方法在其内部是调用了"=="运算符,即在不重写equals方法的情况下,equals方法是比较两个对象是否具有相同内存地址。而equals方法的重写涉及到值传递与地址传递问题(即比较值与地址相等的问题)。而hashCode()默认返回的是这个对象的内存地址,要求相等的对象必须拥有相等的hashcode,所以重写了equals()方法必须要同时重写hashcode()。
相关文章
- 开源直播课丨高效稳定易用的数据集成框架——ChunJun类加载原理与实现
- 开源项目丨ChengYing 1.1版本重磅发布:新增超多功能,全新优化体验!
- 03 uniapp/微信小程序 项目day03
- MatrixOne从入门到实践03——部署MatrixOne
- HTML介绍
- 9 个美观大气的后台管理系统
- 浏览器渲染和原理
- Linux 利用Cgroup 资源控制
- 面试 考察网络请求HTTP相关知识(第六天!)
- 开源公开课丨大数据调度系统Taier任务调度介绍
- Hadoop常见的文件格式及压缩算法
- 在windows上用docker desktop安装StoneDB
- 浏览器同源策略
- 【StoneDB Class】入门第二课:StoneDB整体架构解析
- 用HTTP服务的方式集成 learned cardinality estimation 方法进 Postgresql
- 【StoneDB研发日志】union功能bug记录
- 前端首屏渲染时间的极致优化
- Vue项目打包成docker镜像部署
- VS Code For Web 深入浅出 -- 导读篇
- <video>poster属性不生效问题