Java中==与equals的区别及理解
区别
“”比较的是两个引用在内存空间中的存储位置是否一致,和Object类的equals方法是等价的。但是,Java中存在很多类(如String、Date、Long、HashMap和File等类)都重写了Object类的equals方法,导致其和“”不等价。
分析
如果两个对象的引用相同时(即指向同一对象),“==”操作符返回true;否则,返回flase。
equals方法是由Object类提供的,可以由子类重写,实现多态性。Object类默认的实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
由此可见,默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。但是,Java中很多类,诸如String、Date、Long、HashMap和File等类,都重写了equals方法,这里拿常见的String类为例进行说明。
1 public class Test {
2 public static void main(String[] args) {
3 String str1 = "abc";
4 String str2 = "abc";
5 System.out.println(str1==str2);//true
6
7
8 String str3 = new String("abc");
9 String str4 = new String ("abc");
10 System.out.println(str3==str4); //false
11 System.out.println(str3.equals(str4)); //true
12 }
13 }
上例中第5行的执行结果是true。分析原因:先看第3行代码,先在栈中创建一个对 String类的对象引用变量str1,然后通过引用去字符串常量池里找有没有"abc",如果没有,则将"abc"存放进字符串常量池。这时常量池中并没有“abc”,故在编译期创建好“abc”,存储在了常量池中。第4行代码又创建了对String类的对象引用str2,然后和str1赋值逻辑一样,找”abc”,发现它已经存在,直接令str2指向它。所以str2和str1指向的是同一个“abc”,返回true。
第8行和第9行代码分别创建了2个对象,str3和str4指向的是不同的对象,即上面所说的内存空间中存储位置不同。故str3 == str4 返回的肯定是false。
第11行代码 str3.equals(str4) 之所以返回true,是因为String类重写了equals方法,比较的是内存空间存放的值是否相同。由于存放的都是值“abc”,故返回true。
小结
Java 语言里的 equals方法其实是交给开发者去重写的,让开发者自己去定义满足什么条件时,两个Object是相等的。这就是equals存在的目的。所以不能单纯的说equals到底比较的是什么,若想知道一个类的equals方法是什么意思就需要翻源码,看定义。