目录
相信很多小伙伴们或多或少都会有一点搞不清楚==和equals到底是比较的值还是地址。今天我们来区分一下,在Java中==和equals到底有什么区别。在弄清楚这个问题之前,我们先来学习一些前置知识。
一、Java中的数据类型
在java中数据分为基本数据类型和引用数据类型
1. 基本数据类型
java有八大基本数据类型,分别是byte、char、int、short、long、double、float、boolean
(注意:byte占一个字节,char占两个字节 和C语言略有不同)
对于基本数据类型,各自都有其包装类(是引用数据类型);
对于引用类型,不初始化默认为null,基本数据类型默认为0;
2.引用数据类型
数组、接口、自定义对象以及String都是引用数据类型,引用数据类型存储的是地址。
二、==和equals的区别
先说结论
对于基本数据类型,==比较值
对于引用数据类型,==比较地址,equals重写则比较值,不重写则比较地址
1. ==就是比较存储的值,
基本数据类型存储的就是值,所以比较的就是值;
引用数据类型存储的是地址,所以比较的就是地址。
2. equals方法只用引用类型才有
我们看一下equals的源码
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
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;
}
我们发现equals的源码就是用==来写的,所以不重写equals方法的话,equals和==完全一致,但是重写equals方法的话,就是比较值了。