首先参考文章
http://www.cnblogs.com/findumars/p/3746878.html
对于==
1.==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同
当为基本数据类型的时候,比较的是值的相等。
当为对象的引用的时候,比较的是引用对象在堆上存储的首地址。
2.equals,当我们比较的是自己定义的对象的时候,如果没有重写默认的是继承object的equal,
boolean equals(Object o){
return this==o;
}
从源码可以看出比较的也是存储的首地址,这符合我们new 不同对象开辟内存存储的不相等的逻辑当我们比较的是string,即经常用的类型的时候,就要查看string的equal的实现源码了
public boolean equals(Object arg0) {
if (this == arg0) {
return true;
} else {
if (arg0 instanceof String) {
String arg1 = (String) arg0;
int arg2 = this.value.length;
if (arg2 == arg1.value.length) {
char[] arg3 = this.value;
char[] arg4 = arg1.value;
for (int arg5 = 0; arg2-- != 0; ++arg5) {
if (arg3[arg5] != arg4[arg5]) {
return false;
}
}
return true;
}
}
return false;
}
}
从源码可以看出,首先比较的是地址是否相等,然后比较的是类型是否符合,接着比较的是 长度是否相等,在接着比较的是组成string的子符挨个是否相等,
所以就有了
String a = new String("a");
String b = new String("a");
System.out.println(a == b);
System.out.println(a.equals(b));
第一个false,比较的是地址false,第二个比较的是字符,相等!!!