一言蔽之 == 是引用比较,equals是值比较。
上面这句话基本能解答绝大多数关于 == 和 equals的问题,下面详细为什么会有这样的结论。
== 操作符
Java中类型可以分为基本类型和引用类型。 == 比较两个值可以分成基本类型的比较和引用类型的比较两种情况。对于基本类型的比较,只要它们的值相等,即为相等。因为基本类型的引用地址被存放在栈里面,两个值相同的基本类型指向同一个堆内存地址,取的是同一个内存地址。对于引用类型,则需要引用地址相等,才为相等。因为引用类型存放在堆当中,每一个引用类型在堆内都有自己的引用地址

equals
其实本质上 == 和 equals 是等价的。它们都在比较两个对象在内存中的引用地址,这是 equals的源码
public boolean equals(Object obj) {return (this == obj);}
但通常使用 equals 和 == 的效果不一样,原因就在于 equals 方法被 String和 Integer 重写了。重写之后equals 只比较两个对象的值是否相等,而不需要引用相等
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}
例子
最后看几个例子:
String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true
- x和y是基本类型,且值相等。 true
- x和z值相等,但引用地址不一样。new String() 新建了一个引用。 false
- equals只比较值相等。 true
- 值相等。 true
参考文章
- 面试题|Java基础17道常见面试题:https://zhuanlan.zhihu.com/p/94095050
- 关于java String的“==”和equals()比较、引用的小问题:https://blog.csdn.net/barryhappy/article/details/6082823
- equals 和 == 的区别:https://www.jianshu.com/p/9cbed9f33a4d
