Object类九大方法之equals方法
所有类都从Object类中继承了equals方法,Object类中的equals方法的源代码如下:
public boolean equals(Object obj){
return this=obj;
}
Object中的equals方法是判断this和obj本省的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否为同一个对象,所谓的同一个对象就是指内存中同一块储存的单元(地址值)如果this和obj指向的是同一块内存对象,则返回ture,如果this和obj指向的不是同一块内存,则返回false.
需要注意的是:即便是内容方完全相同的两块不同的内存对象,也返回false.因为比较的是地址值.
那么equals()方法与之前的’=="有什么区别呢?
首先了解一下java内存的只要划分
堆:存放的是New出来的对象,此对象由垃圾收集器收集,垃圾集器针对的就是堆区.
栈:每调用一个方法,会创建一个栈帧,存放局部变量.
方法区:类的所有信息,包括所有的方法,静态变量,常量.
通过下面的代码我们加深一下equals和=的区别:
public class Equals{
public static void main(String[]args){
String s1="apple";
String s2="apple";
System.out.print(s1==s2)//true,比较的是对象的地址值,因为两个对象都存在常量池中所以为true
System.out.print(s1.equals(s2))//true,因为此Equals是Object的方法比较的是内容所以为true
String s3=new String("apple");
String s4=new String("apple");
System.out.print(s3==s4);//false,地址值不一样
System.out.print(s3.equals(s4));//true,因为此Equals是Object的方法比较的是内容所以为true
}
}
结论:
"== "比较的是变量(栈)内存中存放的对象的内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象
“equals”:不能做基本类型的比较,引用类型如果不重写比较的是地址值,重写之后比较的是内容.
从内存的划分我们来理解这个区别
String s1=new String("apple");
String s2=new String("apple");
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
因为“”比较的是两个引用的对象是否相等,从上图很容易看出来不等,所以System.out.println(s1s2),结果为False;而equals()方法比较的是两个对象的实际内容,从图中可以看出s1和s2都指向apple,内容是相同的,所以System.out.println(s1.equals(s2)),结果为True。
String s1="apple";
String s2="apple";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true