1、对于基本数据类型,“==”比较的是两者的值是否相等。
public class ArrayTest {
public static void main(String[] args){
String a = new String("aw");
String b = new String("aw");
System.out.println(a==b);//false
}
}
显然,尽管 a 与 b 对象的值相同,但是在内存中的地址是不同的,即两个对象是不一样的。
public class ArrayTest {
public static void main(String[] args){
String a = new String("aw");
String b = new String("aw");
String c= "aa";
String d= "aa";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
System.out.println(d.hashCode());
System.out.println(a==b);//false
System.out.println(c==d);//true
}
}
运行结果为
3126
3126
3104
3104
false
true
可见两个对象不相同,他们的hashCode值不一定不相同。
hashCode方法实际上返回的就是对象的存储地址。
两个对象相等,首先要满足其hashcode值相等,因为两个不同的对象很有可能共用一个hashcode值。然后equals方法来判断是否相等。只有两种同时满足才能确定他们两个对象是相等的。
可以对照散列表的数据结构理解,hashcode值相当于桶的索引值,equals方法主要是判断在相同索引值下,遍历链表的值是否相同。
故可以得出如下结论:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
3.两个对象不相同,他们的hashCode值不一定不相同。
4.两个对象的hashCode值不相同,他们一定是两个不同的对象
2、对于引用数据类型,(1)“==”比较的是引用的地址是否相同(即是否是同一辆汽车(注意,只有一辆汽车));
Object中的.equals()方法和"==’功能一样
(2)但是String类中的.equals()方法重写了,比较的是两个引用对象的内容是否想同(即是否是完全相同的汽车(注意,有两辆汽车,且一模一样,完全相同))。
equals方法并不关心List的具体实现类,只要是实现了List接口,并且所有元素相等、长度也相等的话就表明两个List是相等的。很明显,list重写了equals方法。
java中ArrayList的equals方法具体实现:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}