==和equals的区别是什么?
==和equals的区别是什么?
对于基本类型和引用类型==的作用效果是不同的,如下所示:
· 基本类型:比较的是值是否相同;
· 引用类型:比较的是引用是否相同;
代码示例:
/**
* 采用字面值方式赋值
*/
String str1="abc";
String str2="abc";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1.hashCode()==str2.hashCode());
System.out.println("=============");
/**
* 采用new关键字创建一个字符串对象
*/
String str_1=new String("abc");
String str_2=new String("abc");
System.out.println(str_1==str_2);
System.out.println(str_1.equals(str_2));
System.out.println(str_1.hashCode()==str_2.hashCode());
以上代码运行结果:
true
true
true
=============
false
true
true
代码解读:因为str1和str2指向的是同一个引用,所以<mark>也是true,而new String()方法则重新开辟了内存空间所以</mark>结果为false,而equals比较的一直都是值,所以结果都为true。
equals解读:
equals本质上就是==,只不过是String和Integer等重写了equals方法,把它变成了值比较。看如下代码。
首先来看默认情况下equals比较一个相同值的对象,代码如下:
public class Person {
String name;
public Person(String name){
this.name=name;
}
public static void main(String[] args) {
Person person=new Person("马云");
Person person1=new Person("马云");
System.out.println(person.equals(person1)); //false
}
输出结果很出乎我们的意料啊,竟然是false?接下来我们看看equals源码就知道了,源码如下:
public boolean equals(Object obj){
return (this==obj);
}
这样我们就可以看出来为什么了,原来equals的本质就是==。
那如果是这样的话,为什么相同的String对象返回的是true?如下代码:
String str_1=new String("微信公众号:IT研读间");
String str_2=new String("微信公众号:IT研读间");
System.out.println(str_1.equals(str_2)); //true
那我们来看看String的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重写了equals方法,将之前的引用比较改成了值比较。
我们来做个总结:
==对于基本类型来说是值比较,对于引用类型来说是比较的引用;
equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它改成了值比较,所以一般情况下equals比较的是值是否相等。
查看10道真题和解析