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的判断场景。
*/
}
}