面试系列(4)equals 和 == 的区别,hashcode 的作用

1、==

对于基本数据类型,== 比较的是他们的值;

对于引用数据类型,== 比较的是对象在内存中的存放地址,对象是存放在堆中,而对象的引用则存在于栈中,所以 == 则比较栈中的值是否相等。

2、equals

默认情况下 equals 方法都是调用 Object 类的 equals 方法,而 Object 的 equals 方法主要用于判断对象的内存地址引用是否为同一个地址。源码如下:

public boolean equals(Object obj) {
    return (this == obj);
 }

可以看出 Object 的 equals 方法与 == 是等效的。

3、String 类对于 equals 方法的重写

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

即 String 中 equals 方法判断相等的步骤是:

1、 若 A==B 即是同一个 String 对象,返回 true

2、 若对比对象是 String 类型则继续,否则返回 false

3、 判断 A、B 长度是否一样,不一样的话返回 false

4、 逐个字符比较,若有不相等字符,返回 false

4、equals 和 hashcode 的关系

1、如果两个对象 equals,Java 运行时环境会认为他们的 hashcode 一定相等。

2、如果两个对象不 equals,他们的 hashcode 有可能相等。

3、如果两个对象 hashcode 相等,他们不一定 equals。

4、如果两个对象 hashcode 不相等,他们一定不 equals。

将对象放入到集合中时,首先判断要放入对象的 hashcode 值与集合中的任意一个元素的 hashcode 值是否相等,如果不相等直接将该对象放入集合中。如果 hashcode 值相等,然后再通过 equals 方法判断要放入对象与集合中的任意一个对象是否相等,如果 equals 判断不相等,直接将该元素放入到集合中,否则不放入。

    原文作者:kevenZheng
    原文地址: https://www.jianshu.com/p/a6178ad20438
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞