码迷,mamicode.com
首页 > 编程语言 > 详细

Java中 == 和 equals()、 equals() 和 hashCode()

时间:2017-08-23 23:06:28      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:his   堆内存   ++   eof   完成   false   高效   地方   highlight   

 == 和 equals()

记住三句话

1. 语义上:==指的是内存引用一样。equals是指的是逻辑相等。逻辑相等具体的意思由编写者决定。

2. 默认情况下(继承自Object类),equals和==是一样的,除非被覆写(override)了。
 public boolean equals(Object obj) {
        return (this == obj);
    }

3. 最典型equals已经被override的例子是String; String中的字符串文本相等则视为逻辑相等(s1.equals(s2)==true)。

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

 

equals()

在初学Java的时候,很多人会说在比较对象的时候,==是比较地址,equals()是比较对象的内容,谁说的?

看看equals()方法在Object类中的定义:

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

这是比较内容么?明显是比较指针(地址)么...

 

但是为什么会有equals是比较内容的这种说法呢?

这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

因为在String中是进行内容的比较

 

hashCode()

在Object类中的定义为:

public native int hashCode();

是一个本地方法,返回的对象的地址值。

但是,同样的思路,在String等封装类中对此方法进行了重写方法调用得到一个计算公式得到的 int值

 

3.两者的关系

①两个obj,如果equals()相等,hashCode()一定相等

②两个obj,如果hashCode()相等,equals()不一定相等

原因:从散列的角度考虑,不同的对象计算哈希码的时候,可能引起冲突,大家一定还记得数据结构中冲突的解决方案吧技术分享

 

但是要这么设计,用两个函数,个人的理解是为了比较两个对象时更高效

可以考虑在Java集合中,判断两个对象是否相等的规则是:

第一步,如果hashCode()相等,则查看第二步,否则不相等;

第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。

 

为什么这样做?个人的理解是让适当的函数完成适当的功能,毕竟hashCode()比equals()在某种程度上来得快。

 

(个人心得,若有错误,请指正)

Java中 == 和 equals()、 equals() 和 hashCode()

标签:his   堆内存   ++   eof   完成   false   高效   地方   highlight   

原文地址:http://www.cnblogs.com/chengdabelief/p/7420549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!