equals方法
==和equals的对比
==是一个比较运算符
- ==:既可以判断基本类型,又可以判断引用类型
- ==:如果判断基本类型,判断的是值是否相等。如 int i=10,double d = 10;
- ==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
- equals:是object的子类,只能判断引用类型
- 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!!不信看下图,编译器报错
记住一句话,看哪个对象调用的equals,再看这个对象的类有没有重写equals()方法