JAVA 中 == 和 equals 的区别

== 和 equals

==是二元操作符
equals() 是方法

==常用于比较原生类型(byte,short,char,int,long,float,double,boolean ),而equals()方法用于检查对象的相等性。如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()返回结果主要取决于重写实现。

以字符串和Integer场景为例:
因为java.lang.String类重写了equals方法,如果两个字符串对象包含有相同的内容它返回true,但是==只有他们引用地址相同时才返回true

        String a="aaa";
        String b="aaa";
        System.out.println(a==b);//T
        System.out.println(a.equals(b));//T
        String c=new String("aaa");
        System.out.println(a==c);//F
        System.out.println(a.equals(c));//T 因为string重写了equals
        Integer d=22;
        Integer e=22;
        System.out.println(d==e);//T
        System.out.println(d.equals(e));//T
        int f=22;
        System.out.println(d==f);//T
        System.out.println(d.equals(f));//T
        Integer g=new Integer(22);
        System.out.println(d==g);//F
        System.out.println(d.equals(g));//T
        System.out.println(new Integer(22)==new Integer(22));//F 比较的是地址值 new的是新建一个对象在内存汇总
        System.out.println(new Integer(22).intValue()==new Integer(22));//T intValue后左边是int类型 右边自动拆箱进行原生类型比较
        System.out.println(new Integer(22).equals(22));//T  Integer 重新了equals方法
        System.out.println(new Integer(22).equals(new Integer(22)));//T 
        System.out.println(new BigDecimal(22).equals(new BigDecimal(22)));//T 
        System.out.println(new BigDecimal(22)==(new BigDecimal(22)));//T 

当比较两个引用指向是Object类型的时候,在不重写equals()方法的时候 ==和equals()比返回值的都是相同的,因为equals()默认实现是比较内存地址值。

通俗的说:
==是比较左右是不是同一个对象
equals是比较左右是不是相同的对象

总结:
1.原生类型的对比(byte,short,char,int,long,float,double,boolean )用 ==
2.字符串的对比、包装类( Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecimal)的对比使用equals代替==,因为底层重写了equals,所以比较的是内容
(ps:其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。)

3.如果两个引用指向相同的对象,==返回true,equals()具体返回结果依赖于具体实现

怎样重写equals()方法?

重写equals方法的要求:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true。
2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5、非空性:对于任意非空引用x,x.equals(null)应该返回false。

重写equals方法参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值