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!!不信看下图,编译器报错

java 比较时一方为空会报错吗_java

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