- ==
######==对于应用类型来说,如果Object obj1和Object obj2,obj1==obj2返回true证明这两个对象的内存地址相同(注意我说的是内存地址相同,而不是hashCode相同,这点区别我在hashCode中会讲),内存地址相同,当然意味着这两个对象也相同了。对于基本数据类型,==则判定的是两个变量的值是否相同。
public class TestDoubleEqual{
public static void main(String[] argv){
//注意这里建立的是两个对象,一个是str,一个是放在常量池中的“hello”
String str=new String("hello");
if(str=="hello"){
System.out.println("str和\"hello\"内存地址相同");
}
else{
System.out.println("str和\"hello\"内存地址不同");
}
int a=0;
int b=0;
if(a==b){
System.out.println("a等于b");
}
else{
System.out.println("a不等于b");
}
}
}
2. hashCode
######hashCode是用来判断两个对象的值(注意我强调的是值)是否相等,因为基本数据类型直接可以体现出值的大小(例如一个int a=1只有四个字节,这四个字节就是用来存1这个值的),因此不需要用hashCode来判断这两个变量的值是否相等。但是对于引用数据类型,我们无法直接比对两个对象的值是否相等(因为对于引用数据类型来说,里面除了保存实际对象的值之外,还保存了一些其他信息)因此我们需要用hashCode相等来表示(我用的是表示,而不是判读,想告诉大家hashCode相等是因为两个对象的值相等)两个对象的值也相等。好了说完hashCode用来干什么了,那什么是hashCode呢,hashCode和对象的地址有关,了解hashCode的人知道,hashCode就是拉链法中数组的下标,关于这个可以参考我的另一篇文章。如果现在大家依然对hashCode有疑惑,不用担心,看完equals()也许你会恍然大悟。
3.equals ()
######equals()方法是用来判断两个引用对象的值是否相等(因为==可以用来判断基本数据类型),那他是如何判断的呢?一下是java源代码
Object
public boolean equals(Object obj) {
return (this == obj);
}
我们知道所有类型的最终基类都是Object,因此如果你在类中没有覆盖Object的equals的话,你用的就是Object的equals,Object的equals方法有局限,我们在==中说道,它只能判断两个对象的内存地址是否相等,却无法判断对象的值是否相等。因此为了判断对象的值是否相等,我们都会刻意的覆盖equals()方法。
这是String的
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;
}
这是String的一个构造方法:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
这也解释了为什么我说hashCode相等是两个对象的值相等的结果了,String为了新建一个值相等的String对象,直接将前一个的hashCode也拷贝了过来,虽然他们是不同的对象。
Double
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
剩下的就不列举了,下一个是我自定义了一个Hello类,然后修改了它的equals方法。
public class Hello{
int i=0;
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Hello){
if(((Hello)obj).i==this.i){
return true;
}
}
return false;
}
public static void main(String[] argv){
Hello obj1=new Hello();
Hello obj2=new Hello();
if(obj1.equals(obj2)){
System.out.println("对象的值相等");
}
}
}