在看别人写代码的时候,有时候会看到用==,有时候看到equals,今天写中缀转后缀时,发现了这两个还是有挺大的区别的。
首先,java中提供了8种基本数据类型,分别是:byte,short,long,int,float,double,boolean,char
对于基本数据类型,他们进行比较的时候用的是:==,比较的是他们的值
其次,对于引用数据类型,引用数据类型分为三种:类 Class,接口 Interface,数组 Array
此时==比较的是地址值
在默认情况下,equals比较的也是地址值,但是在一些类库中对equals方法就行了重写,比如:String,在\src\java\lang目录中找到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;
}
可以看出重写的equals方法先比较了地址,若地址相同则两者的值肯定相等,若地址不同,再去比较长度和内容,最后得到的就是两个字符串的值是否相同,不仅仅是比较了地址。
在java中生成一个字符串有两种方式:
//1
String s1="zifuchuan";
String s2="zifuchuan";
//2
String s3=new String("zifuchuan")
String s4=new String("zifuchuan")
对于第一种情况:
此时使用“==”来比较两个字符串,得到的结果是true,因为带有" "的对象在字符串常量池中保存,且一旦要创建相同的字符串时,那么就将这个字符串的引用,直接指向这个字符串,而不是创建一个新的字符串。并且,字符串常量池中的对象不会被java的垃圾回收器回收。由于此时两个引用指向的是一个字符串常量对象,因此两者是相同的。因为其存储的内存地址是相同的。
对于第二种情况:
两个变量分别指向两个不同的对象,其内存地址肯定不相同,而==比较的是地址,所以得到的false,而经过重写的equals方法比较的是值,所以得到的true。