先说明一下String类型的变量的创建方式
在创建新的String类型的变量时,首先会在缓冲区查找是否有这个产量对应的对象,有就直接将找到的对象的地址赋给新创建的变量,没有就重新创建一个对象,然后赋给新创建的变量
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同上
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方法,源码如下
public boolean equals(Object obj) { return (this == obj); }
"=="比较的就是引用对象的地址是否相等,而不是比较值,比较值的话就需要重写equals方法
对于基本数据类型只能用"==",比较的是两个基本类型的值