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

先说”==”:
对于基本数据类型 (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操做的时候返回的为falseide

再来看”equals”:
Equals方法是在Object类中定义的,全部的类都继承于Object类,因此全部的类都有equals方法。
咱们来看看equals方法的源码:this

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”比较的是两个字符串的内容
相关文章
相关标签/搜索