Java基础笔记 – hashCode()与equals()方法的介绍和使用场合
本文由发表于6年前 | Java基础 | 评论数 2 |  被围观 5,332 views+

equals方法一般是判断两个对象是否相等,可以重写。
Object中的equals方法比较的规则是这样的:

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

• 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
• 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
• 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
• 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
• 对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

判断对象是否相等的hashCode()方法

在HashSet中添加元素时,会判断添加的元素跟已经在HashSet中村中的hashCode是否相等,如果相等则不添加。

而默认的情况下,hashCode是使用对象地址生成的,如果要做特别的添加规则,可以重写这个方法。

如String类就重写了该方法,使得字符串相等时,hashCode也相等,String类的hashCode方法如下:

public int hashCode() {
	int h = hash;
        int len = count;
	if (h == 0 && len > 0) {
	    int off = offset;
	    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

这个方法返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-based-notebook-hashcode-and-equals-method-of-the-introduction-and-use-of-applications.html
关键字: , , ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 10/11
文章评论
    2条评论
  1. Ranger 2014年04月16日01:04:48  #-49楼 回复 回复

    补充一点,值得注意的是 equals() 函数的参数必须是 Object, 而不是你所设计的那个class name,这样才会被 HashMap 之类的调用到。

    public boolean equals( Object obj ) {

    }

    参考: http://www.javaworld.com/article/2074996/hashcode-and-equals-method-in-java-object—a-pragmatic-concept.html

给我留言

有人回复时邮件通知我
Java基础的相关文章
随机文章 本月热门 热评
1 JSF笔记 – MVC和JSF的介绍和下载使用 2011/12/1
2 IT宅电影推荐:《来自虞美人之坡-父与子的300日战争》 2012/3/4
3 Java基础笔记 – 继承InputStream自定义一个简单的字节数组输入流 2011/10/22
4 Java基础笔记 – 枚举类型的使用介绍和静态导入 2011/10/31
5 Hibernate关联映射创建数据库中存在的对象设置关联关系不级联保存的方法 2011/10/2
6 YUI介绍以及快速入门 Yahoo的JS框架 2011/12/19
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.