Java的 == 和 equals

Java的 == 和 equals

1、基本数据类型比较用 ==

public class CompareTest {
    public static void main(String[] args) {
        int i = 999;
        int i2 = 999;
        int i3 = 9999;
        compare(i, i2);//相等
        compare(i, i3);//不相等
    }

    private static void compare(int a,int b){
        if (a==b){
            System.out.println("相等");
        }else if(a!=b){
            System.out.println("不相等");
        }
    }
}

2、引用数据类型比较用==和equals的区别

引用数据类型用 == 比较的是对象的地址。如果是比较值,建议用equals,包括基本数据类型包装类的值的比较

2.1、基本数据类型的包装类的比较
2.1.1、直接用==比较(比较的是对象的地址)
public class CompareTest {
    public static void main(String[] args) {
        Integer i1 = -128;
        Integer i2 = -128;
        Integer i3 = 127;
        Integer i4 = 127;
        compare(i1, i2);//==
        compare(i3, i4);//==
        compare(i1, i3);//!=
        //基本数据类型的包装类的值在[-128,127]之间时,是享元模式。所以在值相等的时候,地址也相等。
        //但是比较的依然是包装类对象的地址。
        
        Integer i5 = -129;
        Integer i6 = -129;
        Integer i7 = 128;
        Integer i8 = 128;
        compare(i5, i6);//!=
        compare(i7, i8);//!=
        compare(i5, i7);//!=
    }

    private static void compare(Integer a,Integer b){
        if (a==b){
            System.out.println("==");
        }else {
            System.out.println("!=");
        }
    }
}
2.1.2、取出基本数据类型包装类的值再用 == 比较
public class CompareTest {
    public static void main(String[] args) {
        Long a = 9999999999999999L;
        Long b = 9999999999999999L;
        Long c = 1L;
        Long d = 1L;
        Long e = a;
        compare(a, b);//==
        compare(a, c);//!=
        compare(null, c);//!=
        //基本数据类型包装类的值在[-128,127]范围内时,享元模式。值相等时地址也相等
        compare(c, d);//Pointer ==
        //地址相等
        compare(a, e);//Pointer ==
        compare(null, null);//Pointer ==
    }

    private static void compare(Long a,Long b){
        if (a==b){//a和b地址相等的时候,包括a和b都为null的时候。
            System.out.println("Pointer ==");
            return;
        }
        if (a!=null && b!=null && a.longValue()==b.longValue()){
            System.out.println("==");
        }else {
            System.out.println("!=");//a和b都有值但是不相等,或者a和b之间有且仅有一个为null。
        }
    }
}
2.1.3、用equals比较
public class CompareTest {
    public static void main(String[] args) {
        Long a = 9999999999999999L;
        Long b = 9999999999999999L;
        Long c = 1L;
        Long d = 1L;
        Long e = a;
        compare(a, b);//equals
        compare(a, c);//not equals
        compare(null, c);//not equals
        compare(a, null);//not equals
        compare(c, d);//equals
        compare(a, e);//equals
        compare(null, null);//a=b=null
    }

    private static void compare(Long a,Long b){
        if (a==null && b==null){
            System.out.println("a=b=null");
            return;
        }
        if (a!=null && a.equals(b)){
            System.out.println("equals");
        }else {
            System.out.println("not equals");
        }
    }
}

包装类equals源码举例(覆写了Object类的equals方法)

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

Object类的equals方法(用的是 ==,比较的是地址)

public boolean equals(Object obj) {
    return (this == obj);
}
2.2、常见的对象的比较

随意准备一个类,覆写equals方法

public class User {
    private long id;
    private String name;
    private String password;
	//提供无参、有参构造方法,setter和getter方法,覆写toString方法。

    //覆写equals方法
    @Override
    public boolean equals(Object o) {
        //地址相等,一定相等
        if (this == o) return true;
        //当前对象不为null而比较对象weinull,或者类型不同,一定不等
        if (o == null || getClass() != o.getClass()) return false;
        //类型相同,从Object类型强制转化到当前类型
        User user = (User) o;
        //比较需要比较的属性值
        return Objects.equals(name, user.name) &&
               Objects.equals(password, user.password);
    }
}

比较对象用equals

public class CompareTest {
    public static void main(String[] args) {
        User user = new User(1L,"zs","123456");
        User user1 = new User(2L,"zs","123456");
        User user2 = user1;
        User user3 = new User(3L,"ls","123456");
        compare(user, user1);//equals
        compare(user2, user3);//not equals
        compare(user1, user2);//==
        compare(null, null);//==
        compare(user, null);//not equals
        compare(null, user);//not equals
        compare(user, "12345");//type not equals
    }

    private static void compare(Object obj1,Object obj2){
        if (obj1==obj2){
            System.out.println("==");
            return;
        }
        if (obj1!=null && obj2!=null && obj1.getClass()!=obj2.getClass()){
            System.out.println("type not equals");
            return;
        }
        if (obj1!=null && obj1.equals(obj2)){
            System.out.println("equals");
        }else {
            System.out.println("not equals");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值