黑马程序员技术交流社区

标题: hashcode方法? [打印本页]

作者: 黑马薛有义    时间: 2011-7-22 00:41
标题: hashcode方法?
sun建议我们在覆盖equals()方法时,也要覆盖hashcode()方法,以保持他们之间逻辑的一致性。
sun怎么不把它作为一种规定,以此免去程序员编程上的麻烦
作者: 匿名    时间: 2011-7-22 00:52
哦,明白了
刚才看了张老师的面试大全,刚好看到关于hashcode()方法的用法,原来在map里边的key的对象才需要保持equals()和hashcode()一致性,如果不不作为map的key就不没有这个要求。。。。
作者: 匿名    时间: 2011-7-22 01:20
楼上的这位哥哥…
以下是鄙人愚见…我觉的hashcode这个方法在hashXXX集合中才能真正体会到它的用处.因为在这种集合中需要用到一种hash算法.
而且set集合不允许存储相同的元素…如果
Equals相同hashcode不同意味着集合不同地方存储相同元素与集合存储规则违背.相反也不行…因为它在一个地方同时存储两个元素这样集合存储性能下降
作者: 匿名    时间: 2011-7-22 01:22
其实在存储集合之后也不能修改参与hashcode运算的相关属性这样会导致无法正常操作集合元素…手机回复的…没办法贴程序代码…见谅…
作者: 匿名    时间: 2011-7-22 01:24
哼…最后还有一句没说…小罗…我恨你
作者: 匿名    时间: 2011-7-23 16:25
楼主:
我在最后一个注释里面写的pt3==pt1,是它们在集合中比较的时候相等,但实际上,它们不等,它们指向的是不同的对象,覆盖hashcode()方法的作用就是让同类产生的两个不同的对象在 hash集合看起是相同的
作者: 匿名    时间: 2011-7-24 13:53
Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。hashcode这个方法是用来鉴定2个对象是否相等的。
一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。
总之,hashcode相当于是一个对象的编码。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。要从物理上判断2个对象是否相等,用==就可以了。
作者: 匿名    时间: 2011-7-24 15:52
[code=java]package com.entity;
public class Student {
        private String name;
        private int age;
        private double score;

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        public double getScore() {
                return score;
        }

        public void setScore(double score) {
                this.score = score;
        }

        public Student() {
        }

        public Student(String name, int age, double score) {
                this.name = name;
                this.age = age;
                this.score = score;
        }

        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + age;
                result = prime * result + ((name == null) ? 0 : name.hashCode());
                long temp;
                temp = Double.doubleToLongBits(score);
                result = prime * result + (int) (temp ^ (temp >>> 32));
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Student other = (Student) obj;
                if (age != other.age)
                        return false;
                if (name == null) {
                        if (other.name != null)
                                return false;
                } else if (!name.equals(other.name))
                        return false;
                if (Double.doubleToLongBits(score) != Double
                                .doubleToLongBits(other.score))
                        return false;
                return true;
        }
       
}[/code][code=java]        public static void main(String[] args) {
                Collection collections = new HashSet();
        Student s1 = new Student ("a",3,3);
        Student s2 = new Student ("b",5,5);
        Student s3 = new Student ("a",3,3);        

        collections.add(s1);
        collections.add(s2);
        collections.add(s3);
        
        System.out.println(collections.size());
        }[/code]输出2
如果不覆盖hashCode方法和equals方法就输出3
单对hashcode解释一下, hashcode只有类的实例对象要被采用哈希算法惊醒存储和检索时,这个类才需要按要求覆盖hashcode方法。即使程序可能暂时不会用到当前类的hashCode方法,但是为他提供一个hashcode方法也不会又什么不好,没准以后什么时候又用到这个方法,所以,通常要求hashCode方法和equals方法一并同时覆盖。




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