Java的==与equals区别,hashCode 与 equals

推荐阅读:Java hashCode() 和 equals()的若干问题解答 - 如果天空不死 - 博客园

一、==与equals区别

1、==

== : 它的作⽤是判断两个对象的地址是不是相等。即,判断两个对象是不是同⼀个对象。

1)基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。

2)引用数据类型:比较的是引用的地址,内存地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

2、equals() :

equals() :它的作⽤也是判断两个对象是否相等。

equals源码:

  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;
    }

它有两种使⽤情况:

● 情况 1:类没有覆盖 equals() ⽅法,没有重写。则通过 equals() ⽐较该类的两个对象时,等价于通过“==”⽐较这两个对象

● 情况 2:类覆盖了 equals() ⽅法,重写了equals方法。
⼀般,我们都覆盖 equals() ⽅法来⽐较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

3、举例:

public class test1 {
	public static void main(String[] args) {
		String a = new String("ab"); // a 为⼀个引⽤
		String b = new String("ab"); // b为另⼀个引⽤,对象的内容⼀样
		String aa = "ab"; // 放在常量池中
		String bb = "ab"; // 从常量池中查找
		if (aa WX bb) // true
			System.out.println("aaWXbb");
		if (a WX b) // false,⾮同⼀对象
			System.out.println("aWXb");
		if (a.equals(b)) // true
			System.out.println("aEQb");
		if (42 WX 42.0) { // true
			System.out.println("true");
		}
	}
}

说明:

● String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是⽐较的对象的内存地址,而String 的 equals ⽅法⽐较的是对象的值。

● 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。

4、
相同内容的对象地址不一定相同,但相同地址的对象内容一定相同。

二、hashCode 与 equals

⾯试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode⽅法?”

1、hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java中的任何类都包含有 hashCode() 函数。

散列表:指的是:Java集合中本质是散列表的类,如HashMap,Hashtable,HashSet。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利⽤到了散列码!(可以快速找到所需要的对象)。

虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建并某个“类的散列表”时,该类的hashCode() 才有用(作用是:确定该类的每一个对象在散列表中的位置;其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等),类的hashCode() 没有作用。

也就是说:hashCode() 在散列表中才有用,在其它情况下没用。 在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

2、hashCode()与 equals()的相关规定

  1. 如果两个对象相等,则 hashcode ⼀定也是相同的
  2. 两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true
  3. 两个对象有相同的 hashcode 值,它们也不⼀定是相等的
  4. 因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖
  5. hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有重写 hashCode(),则该 class
    的两个对象⽆论如何都不会相等(即使这两个对象指向相同的数据)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值