== 和 equals
我们知道所有的java类均继承Ojbect,equals是Object的方法。我们看看equals是怎样实现的
public boolean equals(Object obj) {
return (this == obj);
}
可以看到equals 也是调用的 == ,所以他们的本质是一样的。
String a1 = new String ("aaa"); //创建了一个对象
String a2 = new String ("aaa"); //创建了另一个对象
System.out.println(a1==a2); //false
System.out.println(a1.equals(a2)); //true
既然==和equals 是一样的,为什么 两次结果不一样呢。 那是因为String 类重写了equals方法
public boolean equals(Object anObject) {
if (this == anObject) { //如果两个对象相等
return true;
}
if (anObject instanceof String) { // 对象不相等的情况下,比较的是String 的内容
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
这里我们看到String 的equals 在两个String对象不相等的情况下,比较的是Sting对象的内容。所以equals返回true。
除了String外,还有很多类重写了equals方法,比如包装类Integer,Double,Long等,还比如 java.util.Date,java.util.HashMap等, 其实java,API里面大部分的类都重写了equals方法。我认为如果要比较两个引用是否指向同一个对象,应该用 == , 不应该用 equals ,equals 是让提供给用户自己,实现自己的功能的。以我多年的编码经验来看,我们以后自定义的类也基本要重写equals方法,来实现自己的业务,因为他会帮我们省掉很多麻烦!!!,