黑马程序员技术交流社区

标题: equals的问题 [打印本页]

作者: 谭荣强    时间: 2014-4-7 08:20
标题: equals的问题
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;
        }
}

作者: hyace    时间: 2014-4-7 08:55
本帖最后由 hyace 于 2014-4-7 08:57 编辑

你了解以下数据结构里的散列,也有翻译成杂凑的,就是规定一个函数,计算参数得到一个尽量不同的值,来作为相同与否的标记。
java里也是利用各种参数计算得一个hashcode,至于为什么是31,我看到有说法是因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比乘法的操作效率高的多。
作者: zhangbingyuan    时间: 2014-4-7 09:18
楼主 ,首先 你说的这两行是在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方法,再次判断这两个元素是否是同一个元素的情况。




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