java中equals和==的区别

==比较的是地址,可以比较对象和属性;
equals只用来比较对象,equals内部是由==实现的,所以比较的也是地址,因为每个对象都继承了Object自带equals方法,但有些类库重写了equals方法。

在这里插入图片描述


1.首先对于属性的,因为是八种基本数据类型之一:byte,short,char,int,long,float,double,boolean,只能用==比较,而且比较的是他们的数值。
2.对于一般对象的比较,equals和==的效果相同,都是判断两个对象的地址是否相同,即是否是指相同一个对象。
但是,有几个特例:在一些类库当中equals这个方法被重写了,如String、Integer、Date。在这些特殊的对象中,==比较的还是地址,但是equal比较的是值。
例如我们声明了一个String对象a=“SSSS”,"SSSS"会被放到常量池中,再声明了一个String对象b="SSSS"时,只是指向常量池中同一个字符串的引用,所以,equals和==一样,都是true。如果写b=new String(“SSSS”),指定b偏不用常量池中的数据,结果就变成了false。
Integer在-127-128之间也是默认放到常量池中

代码:

public class LearnEquals {
    int a1 = 128;
    String sss = "SSSSSSSSS";

    public static void fun1() {
        //==八种基本类型,直接比较的值
        LearnEquals learnEquals1 = new LearnEquals();
        LearnEquals learnEquals12 = new LearnEquals();
        //true
        System.out.println(learnEquals1.a1 == learnEquals12.a1);

        //比较一般对象,==和equal一样,比较的地址
        //false
        System.out.println(learnEquals1 == learnEquals12);
        //false
        System.out.println(learnEquals1.equals(learnEquals12));

        //Integer是对象,int是属性。由于-127-128之间的数在常量池中,所以对象地址相同。
        Integer i1 = 127;
        Integer i2 = 127;
        Integer ic = new Integer(127);

        //true
        System.out.println(i1 == i2);
        //equals这里比较的是值 true
        System.out.println(i1.equals(i2));
        //false
        System.out.println(i1 == ic);
        //equals这里比较的是值 true
        System.out.println(i1.equals(ic));
        Integer i3 = 128;
        Integer i4 = 128;
        //false
        System.out.println(i3 == i4);
        //true
        System.out.println(i3.equals(i4));
    }

    public static void fun2() {
        LearnEquals learnEquals1 = new LearnEquals();
        LearnEquals learnEquals12 = new LearnEquals();
        System.out.println(learnEquals1.equals(learnEquals1));
        String A = "SSSSSSSSS";
        String B = "SSSSSSSSS";
        //常量池 全是true
        System.out.println(A.equals(B));
        System.out.println(A == B);
        System.out.println(A.equals(learnEquals1.sss));
        System.out.println(A == learnEquals1.sss);
    }
}

总结:

比较八种数据类型,只能用==,且是值比较。

比较一般对象(除String、Integer、Date)==和equals一样都是比较地址,看是不是同一个对象。

比较String、Integer、Date时,==还是比较地址(这里还要注意是不是常量池),equals是比较的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值