首页 > 其他分享 >18、实体类对象比对-JSON

18、实体类对象比对-JSON

时间:2023-02-23 23:56:21浏览次数:49  
标签:实体类 return 18 equals JSON jsonObject1 PropertiesVO public

实体类对象相互比较-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()方法

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;
    }
}
View Code

(2)、test测试:

@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);
            }
        }
    }
}
View Code

 

Java中==与equals()的区别:

1、==是运算符,用于比较两个变量是否相等;

2、equals()是Object类的方法,用于比较两个对象是否相等;

总结:

基本数据类型比较使用==,比较他们的值。默认情况下,当对象使用==比较时,比较的是内存地址,如果需要比较对象的内容,需要重写equal方法。

 

hashCode()和 equals()方法为什么要同时重写:

equals()方法在其内部是调用了"=="运算符,即在不重写equals方法的情况下,equals方法是比较两个对象是否具有相同内存地址。而equals方法的重写涉及到值传递与地址传递问题(即比较值与地址相等的问题)。而hashCode()默认返回的是这个对象的内存地址,要求相等的对象必须拥有相等的hashcode,所以重写了equals()方法必须要同时重写hashcode()。

 

 

 

JSONobject操作参考

Java基础参考

 

标签:实体类,return,18,equals,JSON,jsonObject1,PropertiesVO,public
From: https://www.cnblogs.com/Iven-L/p/17149920.html

相关文章

  • CF818G - Four Melody
    题意:对于一个序列,令一个\(melody\)为一个子序列满足子序列的相邻两项相差\(1\)或者模\(7\)同余。现在提取四个不重合的\(melody\),求最长总长度。我们先考虑暴力的......
  • CF818F - Level Generation
    题意:假设当前有\(n\)个点,求最多的边数,使得桥的数量\(\ge\lceil\dfrac{m}{2}\rceil\)。我们考虑构造,首先,整张图一共只有一个双连通分量。因为我们如果有两个双连通分量,......
  • KingbaseES Json 系列四:Json数据操作函数二
    KingbaseESJson系列四--Json数据操作函数二(JSONB_PRETTY,JSONB_STRIP_NULLS,JSON_OBJECTAGG,JSON_EQUAL,JSON_EXISTS,JSON_STRIP_NULLS)JSON数据类型是用来存储JSON(J......
  • KingbaseES Json 系列三:Json数据操作函数一
    KingbaseESJson系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSONB_EXTRACT_PATH_TEXT,JSON_EACH,JSON_EACH_TEXT,JSO......
  • KingbaseES Json 系列二:Json对象函数
    KingbaseESJson系列二--Json对象函数(JSONB_BUILD_OBJECT,JSONB_OBJECT,JSON_BUILD_OBJECT,JSON_OBJECT)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数据......
  • KingbaseES Json 系列一:Json构造函数
    KingbaseESJson系列一--Json构造函数(JSON,ROW_TO_JSON,TO_JSON,TO_JSONB)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数据的。KingbaseES为存储JSON数据......
  • KingbaseES Json 系列十:Json数组构造函数
    KingbaseESJson系列十--Json数组构造函数(ARRAY_TO_JSON,JSONB_BUILD_ARRAY,JSON_ARRAY,JSON_BUILD_ARRAY)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数......
  • KingbaseES Json 系列九:Json路径查询函数
    KingbaseESJson系列九--Json路径查询函数(JSONB_PATH_EXISTS,JSONB_PATH_MATCH,JSONB_PATH_QUERY,JSONB_PATH_QUERY_ARRAY,JSONB_PATH_QUERY_FIRST)JSON数据类型是用来......
  • KingbaseES Json 系列八:Json记录操作函数三
    KingbaseESJson系列八--Json记录操作函数三(JSON_TABLE)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数据的。KingbaseES为存储JSON数据提供了两种类型:JSO......
  • KingbaseES Json 系列七:Json记录操作函数二
    KingbaseESJson系列七--Json记录操作函数二(JSONB_POPULATE_RECORD,JSONB_POPULATE_RECORDSET,JSON_POPULATE_RECORD,JSON_POPULATE_RECORDSET)JSON数据类型是用来存储......