Java 中 equals 和 == 的区别和联系

2019-02-18  本文已影响2人  FoxLayla

Java 中 equals 和 == 的区别和联系

概述

相等操作符==

equals方法

相等操作符和equals方法的区别

  1. equals()是方法,而==是操作符

  2. 基本数据类型的比较使用==,对象的比较推荐使用equals()

    • 原因是:对象是引用数据类型,对象变量保存的是对象的存储地址,因而使用==比较对象实际上比较的是地址是否相同(即,是否指向同一处内存空间),而使用重写后的equals()方法可以比较两个对象的内容是否相同。

    例如:String是一种对象,我们在比较两个字符串时,希望比较的是字符串的内容而非存储的地址,因此String类重写了equals()方法

    String s1 = new String("HELLO"); 
    String s2 = new String("HELLO"); 
    System.out.println(s1 == s2); // false:因为s1和s2是两个对象,存储的地址不同
    System.out.println(s1.equals(s2)); // true:因为s1和s2存储的内容相同
    
    int s1 = 1;
    int s2 = 1;
    s1 == s2; // true
    
    Integer s1 = new Integer(1);
    int s2 = 1;
    s1 == s2; // false
    
    Interger s1 = new Integer(1);
    Interger s2 = new Integer(1);
    s1 == s2; // false
    

补充:hashcode方法

hash算法

77 969 25 323 28 458 340
索引 0 1 2 3 4 5 6 7 8 9 10

需要注意的是,不同元素经过hash后可能获得相同的散列值,在这种情况下需要进一步进行散列。

因此可以知道,不同散列值对应的元素一定是不同的,但不同元素的散列值可能相同利用hash算法可以判断元素是否不相等

hashCode方法

// 示例:
class People{
    private String name;
    private int age;
     
    public People(String name,int age) {
        this.name = name;
        this.age = age;
    }  
    
    // 只重写equals()方法
    @Override
    public boolean equals(Object obj) {
        return this.name.equals(((People)obj).name) && this.age == ((People)obj).age;
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        People p1 = new People("Jack", 12);
        System.out.println(p1.hashCode()); // 返回值为p1的地址
             
        HashMap<People, Integer> hashMap = new HashMap<>();
        hashMap.put(p1, 1); // 即指定了p1的索引值为1
         
        People p2 = new People("Jack", 12); 
        System.out.println(hashMap.get(p2)); // 输出:null
    }
}

上述代码期望的输出为“1”,但实际的输出为null,发生上述现象的原因是:p2对象的存储地址与p1不同,由于People类中只重写了equals()方法而未重写hashCode()方法,则hashMap的get方法无法根据hash值查找到对应的对象,因而返回null。如果希望上述代码按照期望输出“1”,则需要重写hashCode()方法,使equals()方法和hashCode()方法在逻辑上保持一致,例如:

public int hashCode() {
        return name.hashCode()*37+age;
}
上一篇下一篇

猜你喜欢

热点阅读