• 先说明一下String类型的变量的创建方式

    在创建新的String类型的变量时,首先会在缓冲区查找是否有这个产量对应的对象,有就直接将找到的对象的地址赋给新创建的变量,没有就重新创建一个对象,然后赋给新创建的变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String str = "str";//创建一个新的String类型的变量,在已有的缓冲区中没有就重新创建一个
    String str1 = "str";//创建时在缓冲区发现有和即将创建的值一样的对象,就将str的地址赋给str1
    str == str1;//true
    String str2 = new String("str");//强制创建一个对象str2,地址和str,str1不同
    str2 == str;//false因为==比较的是对象的地址,而二者地址不同,故为false
    str2 == str1;//false同上

    str2.equals(str1);//true String继承Object方法中的equals方法进行重写,内部比较是两个String类型的字符串一个一个字符的比较(下边是源码)
    str2.eauals(str);//true同上


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean equals(Object anObject) {//String类中equals源码
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”的比较

    所有的类都继承了Object类,Object类中有一个equals方法,源码如下

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

    “==”比较的就是引用对象的地址是否相等,而不是比较值,比较值的话就需要重写equals方法

对于基本数据类型只能用”==”,比较的是两个基本类型的值