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方法是什么意思就需要翻源码,看定义。

Reference

https://www.cnblogs.com/whcwkw1314/p/8044947.html


  读后有收获,小礼物走一走,请作者喝咖啡。

赞赏支持

原文地址:https://www.cnblogs.com/east7/p/14533252.html