Java面试题目:==和equals的对比

equals方法

==和equals的对比

==是一个比较运算符

  1. ==:既可以判断基本类型,又可以判断引用类型

  2. ==:如果判断基本类型,判断的是值是否相等。如 int i=10,double d = 10;

  3. ==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

  4. equals:是object的子类,只能判断引用类型

  5. equals默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等

            int a =100;
            int b =100;
            System.out.println(a==b); //teue
    
            String s1 ="123";
            String s2 ="123";
            System.out.println(s1==s2); //true
    

    对于基本数据类型(byte,short,char,int,float,double,long,boolean)来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。

    另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么再出一个问题考考大家 ↓

            Integer x =127;
            Integer y =127;
            System.out.println(x==y);  //true
    
            Integer m =128;
            Integer n =128;
            System.out.println(m==n);  //false
    

    结果返回true,false。其实是因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。

    方法 基本数据类型 引用类型
    == 判断的是值(因为在常量池中,地址相同,所以可以用来比较值) 判断的是地址
    equals 只能判断引用类型 1.object默认情况下判断的是地址是否相等 2.但是String,Integer,Date类重写了该方法,则可以判断引用对象的值是否相等

    equals只能判断引用类型,判断基本数据类型不能用equals!!不信看下图,编译器报错

image-20210708141452231

​ 记住一句话,看哪个对象调用的equals,再看这个对象的类有没有重写equals()方法

猜你喜欢

转载自blog.csdn.net/weixin_44199207/article/details/118601860