黑马程序员技术交流社区

标题: hashcode() [打印本页]

作者: 徐传任    时间: 2012-9-16 17:26
标题: hashcode()
集合中的hashcode重写,public int hashCode(){return  name.hashCode()^age;},^ 异或符号。这里return的应该是一个对象的hashCode。毕竟比较是否重复,应该是两个对象的比较,像重写的equals(),里面是this.name.equals(stu.name),有个this对象,还有个student  stu对象,hashcode呢?

作者: 夏天    时间: 2012-9-16 19:11
解释是这样的,当你往集合中添加第一个元素的时候,(不管你重写不重写)集合都会自动调用hasCode方法,算出一个哈希值
当你再往集合中添加元素时。系统会再算出此元素的哈希值,并自动判断跟之前元素的哈希值是否相同。如果相同,就需要equals方法,来判断元素的属性是否都一样。
给你举个例子

元素要往哈希表结构的容器中存储,必须具备hashCode和equals方法。(Object已经提供了这两个方法。  对象创建在堆内存中就是因为有了hashCode方法.)
//覆写hashCode方法的原因。Object中的hashCode是本地(windows)方法,只算内存地址.
//不覆写会根据内存地址判断资料相同的人不是同一个人。
//满足不了人的姓名和年龄相同 既为同一个人的要求。所以要依据对象自身特别不同。

//覆写equals的原因:HashSet判断元素唯一的依据是自动调用equals方法。
//不覆写的话,如果hash值万一相同的话,就需要逐个比较元素的属性,而原来的equals满足不了这个要求
代码如下:
@Override
// 覆写hashCode方法的原因。Object中的hashCode是本地(windows)方法,只算内存地址.
        // 不覆写会根据内存地址判断资料相同的人不是同一个人。
        // 满足不了 人的姓名和年龄相同 既为同一个人的要求。所以要依据对象自身特别不同。
        public int hashCode() {
                final int prime = 31;
                return name.hashCode() + age * prime;
                // *prime的原因。防止姓名的哈希值是40,年龄是20 与姓名的哈希值是20,年龄是40 。而引起哈希值相同,多运行equals方法
        }

        @Override
        // 覆写equals的原因:HashSet判断元素唯一的依据是自动调用equals方法。
        // 不覆写的话,如果hash值万一相同的话,就需要逐个比较元素的属性,而原来的equals满足不了这个要求,
//如果主方法中添加的元素内容不是一模一样的,几乎不可能调用equals方法。

作者: 徐传任    时间: 2012-9-16 19:13
夏诗瑶 发表于 2012-9-16 19:11
解释是这样的,当你往集合中添加第一个元素的时候,(不管你重写不重写)集合都会自动调用hasCode方法,算 ...

恩,谢谢......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2