java-equals和==的比较,equals和hashCode的联系

二者的比较有以下一段代码引出

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值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,894评论 18 399
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,702评论 0 16
  • 参考:Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题:1 eq...
    jacky123阅读 3,385评论 0 5
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,118评论 0 11
  • 在这大天世界里,每个人都有一份最真的心,可是往往很多时间人们都藏起他。
    红酒佳坊阅读 1,404评论 0 0