前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Java Objects.equals 比较demo

Java Objects.equals 比较demo

作者头像
oktokeep
发布2024-12-06 08:36:39
发布2024-12-06 08:36:39
3000
代码可运行
举报
文章被收录于专栏:第三方工具第三方工具
运行总次数:0
代码可运行

Java Objects.equals 比较demo

代码语言:javascript
代码运行次数:0
复制
package com.example.core.mydemo.java3;

import java.util.Objects;

/**
 * output:
 flag=false
 flag2=true
 flag3=false
 flag4=true
 flag5=true
 flag6=true
 flag7=false
 flag8=true
 flag9=false
 */
public class ObjectsTest {
    public static void main(String[] args) {
//        String ss = "{\"wzDetailHandleList\":[{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700002\",\"wzTime\":\"2024-09-23 10:26:00\",\"handleStatus\":\"1\"},{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700003\",\"wzTime\":\"2024-09-10 17:31:00\",\"handleStatus\":\"1\"},{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700004\",\"wzTime\":\"2024-09-08 01:51:00\",\"handleStatus\":\"1\"}]}";
//        String ss2 = "[{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700002\",\"wzTime\":\"2024-09-23 10:26:00\",\"handleStatus\":\"1\"},{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700003\",\"wzTime\":\"2024-09-10 17:31:00\",\"handleStatus\":\"1\"},{\"orderNo\":\"60312220904299\",\"ryWzCode\":\"2024101700004\",\"wzTime\":\"2024-09-08 01:51:00\",\"handleStatus\":\"1\"}]";

        Long id = 888L;
        Integer id2 = 888;
        boolean flag = Objects.equals(888,id);
        System.out.println("flag=" + flag);

        boolean flag2 = Objects.equals(888,id2);
        System.out.println("flag2=" + flag2);

        /**
         * 字符串与Integer对比,需要区分。
         */
        String id3 = "888";
        if(id3.equals(888)){
            System.out.println("flag3=true");
        }else{
            System.out.println("flag3=false");
        }

        Integer d1 = new Integer(1);
        Integer d2 = new Integer(1);
        //Integer和int比较时,会自动拆箱,这是比较值是否相等。
        if(d1 == d2.intValue()){
            System.out.println("flag4=true");
        }
        if(d1.equals(d2)){
            System.out.println("flag5=true");
        }
        if(d1.equals(1)){
            System.out.println("flag6=true");
        }

        //两个Integer比较时,比较的是它们指向的引用(即内存地址)是否相等。
        if(d1 == d2){
            System.out.println("flag7=true");
        }else{
            System.out.println("flag7=false");
        }

        //因为Integer有一个常量池,-128~127直接的Integer数据直接缓存进入常量池。所以1在常量池,而128不在。
        Integer d3 = 1;
        Integer d4 = 1;
        if(d3 == d4){
            System.out.println("flag8=true");
        }else{
            System.out.println("flag8=false");
        }

        Integer d5 = 128;
        Integer d6 = 128;
        if(d5 == d6){
            System.out.println("flag9=true");
        }else{
            System.out.println("flag9=false");
        }

        String e = "abc";
        String f = "abc";
        //如果一个普通的字符串变量,跟new出来的字符串对象使用号判断时,返回false。这一点,跟之前说过的用一个基本类型和一个包装类,使用号判断的结果有区别,字符串没有自动拆箱的功能
        String g = new String("abc");
        String h = new String("abc");

        System.out.println("flag10=" + (e == f));//结果:true
        System.out.println("flag11=" + (e == g));//结果:false
        //两个new出来的字符串对象使用==号判断时,也返回false。
        System.out.println("flag12=" + (g == h));//结果:false

        System.out.println("flag13=" + (e.equals(f))); //结果:true
        System.out.println("flag14=" + (e.equals(g))); //结果:true
        System.out.println("flag15=" + (g.equals(h))); //结果:true

        int a = 1;
        Integer b = new Integer(1);
        Integer c = null;
        System.out.println("flag16=" + (a == b));//结果:true
        //但由于c在自动拆箱的过程中,需要给它赋值int的默认值0。而给空对象,赋值0,必然会报空指针异常。
//        System.out.println("flag17=" + (a == c)); //结果:NullPointerException

        //使用Objects.equals方法比较两个对象是否相等,确实可以避免空指针问题。
        /**
         * 而Objects.equals方法内部也使用了a==b比较引用是否相等,为啥它没有抛异常?
         * 答:因为而Objects类的equals方法,使用了Object类型接收参数,它的默认值是null,不用进行类型转换,也不用像int类型对象赋值默认值0。
         */
        System.out.println("flag18=" + Objects.equals(a,c)); //结果:flag18=false

        Integer a2 = 1;
        long b2 = 1L;
        /**
         * 由此可见,我们在使用Objects.equals方法,判断两个值是否相等时,一定要保证两个入参的类型要一致。否则即使两个值相同,但其结果仍然会返回false,这是一个大坑。
         */
        System.out.println("flag19=" + Objects.equals(a2, b2));  //flag19=false
        System.out.println("flag20=" + (a2 == b2)); //flag20=true
        //如何解决:
        System.out.println("flag21=" + Objects.equals(a2, (int)b2));  //flag21=true
        System.out.println("flag22=" + Objects.equals(b2, (long)a2)); //flag22=true
        /**
         * 常见的坑有:
         * Long类型和Integer类型比较,比如:用户id的场景。
         * Byte类型和Integer类型比较,比如:状态判断的场景。
         * Double类型和Integer类型比较,比如:金额为0的判断场景。
         */

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档