您的位置:首页 > 其它

"=="和 equals 方法究竟有什么区别?

2019-08-17 22:08 351 查看

先说”==”:
对于基本数据类型 (byte,short,char,int,long,float,double,boolean)的变量”==”比较的是两个变量的值是否相等。
比如:int a = 3; int b = 3; a==b;返回就是true
对于引用类型如,则比较的是该变量所指向的地址.
拿我们最常用的String型来举例:
比如:String a = “abc”; String b = “abc”;
在这种情况下 字符串直接赋值给变量,该字符串会进入到常量池中,当第一次将 “abc”赋值给a的时候,会去常量池中找看有没有”abc”这个字符串,如果有的话,就将a指向该字符串在常量池中的地址,如果没有则在常量池中创建,第二次赋值 将 “abc”赋值给b的时候同样去常量池中找”abc”这个字符串,然后将他的地址赋值给b.
所以我们在做 a==b操作的时候返回的为true
再来看另一种情况:String a = new String(“abc”) ; String b = new String(“abc”);
这种情况下 创建出来的”abc”对象会被存储到堆,a和b指向的“abc”分别存储到堆内存的不同位置。a和b里面保存的是”abc”在堆里面的内存首地址,这两个地址明显是不同的,所以我们在做 a==b操作的时候返回的为false

再来看”equals”:
Equals方法是在Object类中定义的,所有的类都继承于Object类,所以所有的类都有equals方法。
我们来看看equals方法的源码:

public boolean equals(Object obj) {
return (this == obj);
}

可以看到在Object类的equals方法中也是用的”==”来进行比较,所以在进行比较时它和”==”应该时等价的,但是为什么我们在做 字符串比较的时候 两者比较出来的结果不一样呢?
原因就是 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方法中对字符串的字符进行了逐一比较如果都相同则返回true.所以对于String中的equals方法比较的是两个字符串的内容对于:
String a = new String(“abc”) ; String b = new String(“abc”);
由于a和b的内容相同,返回true.
总结:

  1. 对于字符串的比较“==”比较的是两个字符串的地址
  2. 对于字符串的比较 “equals”比较的是两个字符串的内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: