黑马程序员技术交流社区

标题: hashcode的作用 [打印本页]

作者: 史晓霞    时间: 2011-11-14 10:51
标题: hashcode的作用
hashcode的作用?
作者: 咪咪    时间: 2011-11-14 11:02
是用来存放对象的哈喜值的吧,是十六进制。就相当于内存地址。这个了解就行了,一般在hashset集合中用于判断对象的这个地址是否相同来存储数据的。
作者: 张奇云    时间: 2011-11-14 11:49
hashCode() 是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,,hashCode() 方法使用来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的桶里面,Map在搜索一个对象的时候先通过 hashCode()找到相应的桶,然后再根据equals()方法找到相应的对象.
作者: 王新春    时间: 2011-11-14 13:50
1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

有一个概念要牢记,两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。

所以hashcode相等只能保证两个对象在一个HASH表里的同一条HASH链上,继而通过equals方法才能确定是不是同一对象,如果结果为true, 则认为是同一对象不在插入,否则认为是不同对象继续插入
作者: 王维波    时间: 2011-11-14 16:25
Hashcode的作用   
改写equals时总是要改写hashCode
java.lnag.Object中对hashCode的约定:

   1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
   2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
   3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。



作者: fly51888    时间: 2011-11-14 17:43
本帖最后由 fly51888 于 2011-11-14 18:02 编辑

hashcode是虚拟机根据类的成员变量和类的成员方法产生的哈希码,具体怎么产生的得问虚拟机老大哥了,我是不太清楚滴。
例如:内存中有这样的位置:0,1,2,3,4,5。记住长度不是5  是为6哦!一般一个类中都有一个唯一标示该类的哈希码,就是hashcode啦,
也就是我们常用的ID,假设ID=9。当我们想把一个类放在这六个位置中的一个时,用ID%6=3,那么就应该把这个类放在3的这个位置;如果ID=6,
则ID%6=0,就应该把类放在0这个位置。当然在实际的程序代码中ID的数字肯定不会这么小啦,比如64322323之类的,我只是为了易懂而已。
用哈希算法是因为存取效率相对比较高。
    那么此时就会有人会问:如果遇到两个类有相同的hashcode怎么办?  此时就需要用到equals方法了。比如一个User类

public class User {

        private int id;
        private String name;
        public int getId() {
                return id;
        }
        public void setId(int id) {
                this.id = id;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
       
                @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                User other = (User) obj;
                if (id != other.id)
                        return false;
                if (name == null) {
                        if (other.name != null)
                                return false;
                } else if (!name.equals(other.name))
                        return false;
                return true;
        }
       
}

如果两个类的hashcode码相同,但不是同一个类,那么equals方法就可以把把它们打回原形。
equals方法判断方法如下:
1,如果两个类同属一个类则返回true;
2,如果传递过来的类为null,则返回false;
3,如果两个类的字节码不相等,则返回false(注:字节码是反射里的内容,不懂的可以去查下,如果两个类是同一个类,那么它们使用同一个字节码);
4,如果两个类的ID不相等,则返回false。
5,如果两个类的name属性有一个为null,一个不为null,则返回false。
6,如果两个类的name属性都不为null,且值不相等也会返回false;
7,其余情况就会返回true;




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