A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谭荣强 高级黑马   /  2014-4-7 08:20  /  722 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ReflectPoint是要存入hashSet的一个对象,eclipse里面默认的equals方法的这两行什么意思啊 记得老毕教的的是: x*30+y 这样写。
result = prime * result + x;
result = prime * result + y;

public class ReflectPoint {
        private int x;
        public int y;
        public ReflectPoint(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }         
        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + x;
                result = prime * result + y;
                return result;
        }
}

2 个回复

倒序浏览
本帖最后由 hyace 于 2014-4-7 08:57 编辑

你了解以下数据结构里的散列,也有翻译成杂凑的,就是规定一个函数,计算参数得到一个尽量不同的值,来作为相同与否的标记。
java里也是利用各种参数计算得一个hashcode,至于为什么是31,我看到有说法是因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比乘法的操作效率高的多。
回复 使用道具 举报
楼主 ,首先 你说的这两行是在hashCode方法中的。

result = prime * result + x; //将x坐标经过运算赋值给result
result = prime * result + y; //将result经过运算,并加上y再赋值给result
最后这个result就是要返回的哈希值。这里哈希值的计算方法是灵活多样的,你计算地越复杂,那么每个元素的hashCode就更不容易重复。如果仅仅是对x进行运算而返回hashCode值的话,那么对于(2,6)和(2,9),这两个坐标的hashCode值就会相同,而如果对x和y都参与处理的话,例如就用上面的方法计算,就会得到不同的hashCode。

另外,在hashSet集合中存储元素时,如果两个元素的hashCode值不同,那么就直接将元素存储在hashSet集合中。如果两个元素的hashCode相同,那么还要调用equals方法,再次判断这两个元素是否是同一个元素的情况。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马