二者的比较有以下一段代码引出
public class Test {
public String name="abc";
public static void main(String[] args) {
Test test=new Test();
Test testb=new Test();
String a=new String("a");
String b=new String("a");
System.out.println(test.equals(testb));//false
System.out.println(test==testb);//false
System.out.println(test.name.equals(testb.name));//true
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
}
}
Object中equals的源码如下。
equals和==的比较
基本数据类型只需要用==比较值得大小即可。
对于对象而言,==用于判断是不是指向同一个对象,即内存地址的比较。
而equals() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。有以下特点,先看源码
public boolean equals(Object obj){
return (this==obj);
}
根据源码可以看出,没有重写 equals时,是直接用==判断的,所以比较的还是内存地址。若想用equals()用来判断对象的值是否相等,就要重写equals()。
例如Person对象有两个属性,name和age,若两个Person对象的name和age相同,那么equals应该返回True。
String重写了equals方法,比较的数值内容。
equals()和hashCode()的联系
hashCode()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
hashCode()的作用是获取hash值,也称为散列码;它实际上是返回一个int整数。这个hash值的作用是确定该对象在哈希表中的索引位置。也就是说hash值要在一些数据结构中才能显现作用。hashcode一般用在hashmap、hashset里,判断要把数据放在数组的什么位置。
下面,我们以HashSet为例,来深入说明hashCode()的作用。
假设,HashSet中已经有1000个元素。当插入第1001个元素时,需要怎么处理?因为HashSet是Set集合,它允许有重复元素。 “将第1001个元素逐个的和前面1000个元素进行比较”?显然,这个效率是相等低下的。散列表很好的解决了这个问题,它根据元素的散列码计算出元素在散列表中的位置,然后将元素插入该位置即可。对于相同的元素,自然是只保存了一个。 由此可知,若两个对象相等,它们的散列码一定相等;但反过来不一定。在散列表中,
1、如果两个对象相等,那么它们的hashCode()值一定要相同。这里的相等是指,通过equals()比较两个对象时返回true。
2、如果两个对象hashCode()相等,它们并不一定相等。
对于一个对象如何求其hash值,可以有这样一个思路:
1、对于对象中的每个属性求其hash值
2、对每个属性的hash值进行整合,得到一个最终的结果,即可看作是这个对象的hash值。