(二十五)“==”、equals、hashcode有什么区别

一、“==”运算符

比较基本数据类型的值或两个引用变量是否指向同一对象是否相同,只能用“==”运算符

二、equals()方法

每一个java类都继承自Object,所以每个类都有equals方法。所以在没有覆盖equals方法情况下,equals与"=="运算符比较的是两个对象(引用)。

Object 中equals方法并没有被final修饰,所以子类可以覆盖这个方法,达到比较的是数据具体内容,如下的String

关于根据具体内容判断两对象一致问题,覆盖方法的书写参考https://blog.csdn.net/jiangshangchunjiezi/article/details/74905769

 //Object类 直接使用"=="运算符比较两个对象
public boolean equals(Object obj) {
        return (this == obj);
    }
/*   String 类
     Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
*/
  public boolean equals(Object anObject) {
        if (this == anObject) //先判断是否为同一个对象
        {
            return true;
        }
        if (anObject instanceof String) //判断是否为String的实例,否则会发生不能向下转换问题
       {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) //比较每个char是否相同
            {
                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;

三、hashcode()方法

①从Object类中继承过来,它也是鉴定两个对象是否相等。Object类中的hashCode()方法返回对象在内存中地址转换成一个int值,所以没有重写hashCode()方法,任何对象的hashCode()都是不同的

②hashCode重要性的由来:

Java中的集合有两类,一类是List(有序,元素可以重复),再有一类是Set(无序,元素不可以重复)

如何判断元素是否重复?

若采用equals方法,则将新增元素与已有的元素比较,效率太低。

于是,java采用哈希表,hashCode方法实际上返回的是对象存储的物理位置(实际不一定)。这样,当集合元素新增时,就先调用这个元素的hashCode方法,就一下子找到应该放置的物理位置了。若这个位置没有元素,则直接放在这位置;若有,再调用equals方法与新元素比较,相同则不存;不同则散列其他的地址。

https://blog.csdn.net/jiangshangchunjiezi/article/details/75212185

所以这里存在一个冲突解决的问题,但是调用equals方法的次数大大降低了,几乎只需一两次

通过上面的描述总结:hashcode为了提高set这类不允许重复的集合的效率而已

结论: (hashcode()方法返回值与equals()方法的关系:)

①若equals()方法返回为true,则hashcode()方法也会产生同样的整数结果 (因为hashcode不一致,才会调用equals)

②若equal()方法返回为false,则hashcode()可能相等,也可能不等。存在两种情况:hashcode返回值相等,需equal再判断元素是否相等;若hashcode()不等,则equals()一定不等。

hashcode()方法返回值与equals()方法的区别:

①equals()方法是给用户调用的;hashcode()方法用户一般不调

②hashcode相当于对象的编码,返回int 相对不直观

参考:https://www.cnblogs.com/batys/archive/2011/10/25/2223942.html

 

 

 

posted @ 2019-02-17 12:59  测试开发分享站  阅读(111)  评论(0编辑  收藏  举报