Java中 “==” 和equals()的区别
"=="运算符:可以使用在基本数据类型变量和引用数据类型变量中
如果比较的是基本数据类型,则比较两个变量保存的数据是否相等(不一定类型要相同)
代码举例
public class EqualsTest {
public static void main(String[] args) {
//声明两个int型变量和一个double型变量
int i = 10;
int j = 10;
double d = 10.0;
//比较并输出结果
System.out.println(i == j);//True
System.out.println(i == d);//True
}
}
这里 i 和 j 两个int型变量比较很明显是True,而 i 和 d 的时候就涉及到自动类型提升的问题了
在i 和 d 比较的时候int型的 i 会自动提升为double型变成10.0,这时他们两个比较结果也自然是True。
关于boolean型和char型
//boolean b = true;
//System.out.println(i == b );//编译不通过
char c = 10;
System.out.println(i == c);//True
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//True
boolean 类型是不能用在 "=="运算符中的,所以编译不能通过
而在 char 型的 c 的比较中,因为char类型的字符都对应有ASCII码值,所以这里的10和int型的10相同,所以返回True
有了上一个的铺垫 c1 和 c2 也很容易理解了, 字符 A 在 ASCII码中对应的是65,所以和 c2 的65比较结果也是True
如果比较的是引用数据类型变量,则比较两个对象的地址值是否相同,即两个的引用是否指向同一对象的实体
代码举例
//声明两个相同值得String类型的变量
String str1 = new String("test");
String str2 = new String("test");
//比较并输出
System.out.println(str1 == str2);//false
结果很简单粗暴,就是false,因为虽然这两个变量的值相同,但是他们是两个不同的对象,在内存中都有属于自己的独立空间,地址值不相同,所以false.
equals()方法:只可以比较引用数据类型变量。
equals()方法实际上是所有类的根父类object类中的方法,所以我们用的equals()其实就是调用父类的方法而已。让我们到object类中看看它的具体实现。
public boolean equals(Object obj) {
return (this == obj);
}
从中我们可以看出,object类中的equals()方法居然就是直接用了 “==”,即比较两个引用数据类型变量的地址值,那我们就参照上面的代码运行试试看
//声明两个相同值得String类型的变量
String str1 = new String("test");
String str2 = new String("test");
//比较并输出
System.out.println(str1.equals(str2));
//输出true
但是!我们会很奇怪的发现输出的居然是true?这是为什么呢?
当我们查看String类里的equals()方法发现原来是String类重写了equals()方法
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
可以看到String类的equals()方法是通过一个个的比较内容来比较的。Data、file、包装类等一些类其实都是有自己重写过后的equals()方法来实现他们所需要的比较效果的。
而当我们自己创建一个类时,一般没写equals()方法,会默认调用object()类的,它也只是通过 **"=="**来比较罢了,所以如果我们想要equals()达到我们自己想要的效果的话就得自己重写它。
总结
“==”运算符
- 可以对基本数据类型和引用数据类型使用(boolean型除外)。
- 比较对象是基本数据类型时,比较两者保存的数据是否相同(char型比较ASCII码)。
- 比较对象时引用数据类型时,如果没有重写,默认使用 “==” 比较;重写方法后,可以实现自己所想要达到的效果。