==和equals的区别

一:什么是==?

==(等于比较运算符)如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)

对于基本数据类型,==表示对值是否相等进行判断
        int a = 5;
        int b = 5;
        System.out.println(a==b);//true
对于引用数据类型,==表示对于地址值的判断是否相等
        String str1 = new String("str1");
        String str2 = new String("str2");//false,因为是两个不同的对象,在堆内存中给它开辟了两块不同的内存空间

二:什么是equals?

equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.

public boolean equals(Object obj) {
    return (this == obj);
}

 在源码中我们可以看出,equals在Object类中实际上封装的也是通过==来进行判断的

所以当我们需要两个对象去比较实体内容的话,我们可以考虑将equals进行重写

三:它们之间的区别

== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写。像String、Date、File、包装类等都重写了Object类中的equals()方法。

四:一个小知识点,但是个“坑”

引出Integer中重写后的equals的源码

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

JDK1.5之后,新增了自动拆箱,装箱功能,如以前创建一个Integer对象,需要使用“new”关键字

而现在Java中可以直接赋值如下:

Integer不是new出Integer对象,而是直接赋值,就是自动装箱过程。

        Integer a = new Integer("100");
        //JDK1.5之后
        Integer b = 300;
        int x = 300;
        System.out.println(b==x);

再来测试如下代码:

这里结果不一致原因是,因为new了两个 Integer()对象,开辟了两块内存空间,所以是两个引用类型在进行内存地址之间的比较,而引用变量并没有指向同一个对象地址,所以就是false了

对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128~127之间,则比较结果为ture,如果在这个范围之外则为false

        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);//false
        Integer i = 1;
        Integer j = 1;
        System.out.println(i == j);//true

这里的不同,我们引入了常量缓存池的概念

Integer i = 1时,会将1进行缓存,下次再写Integer j = 1时,就会直接从缓存中取,就不会new了,这样取到的1的地址也是相同的,所以如下==判断返回true。但对于-128到127范围之外的数,实际上就是new才得到的,地址不同==判断为假,所以如下==判断为false

        Integer i = 1;
        Integer j = 1;
        System.out.println(i == j);//true
        Integer i = 128;
        Integer j = 128;
        System.out.println(i == j);//false

为什么常量缓存池是 -128~127?

引入的一个有助于节省内存,提高性能的特征 

这里的引入了拆箱的概念,直接用==比较,Integer类型做了拆箱的操作,会自动拆箱为int,所以也可以直接用==判断

        Integer i = 5;
        int j = 5;
        System.out.println(i==j);

下面这些输出之后是什么,并解释它的原理

 //-128 ~ +127 之间
        Integer a = 5;
        int b = 5;
        Integer c = new Integer(5);
        Integer d = 5;

        System.out.println(a.equals(b));
        System.out.println(a == b);
        System.out.println(a.equals(c));
        System.out.println(a == c);
        System.out.println(a == d);
        //-128 ~ +127 之外
        Integer a = 128;
        int b = 128;
        Integer c = new Integer(128);
        Integer d = 128;

        System.out.println(a.equals(b));
        System.out.println(a == b);
        System.out.println(a.equals(c));
        System.out.println(a == c);
        System.out.println(a == d);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值