Java Objects.equals 比较demo
Java Objects.equals 比较demo
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的判断场景。 */ } }