VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3076|回复: 19

hashCode()的作用

[复制链接]

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-5 12:20:01 | 显示全部楼层 |阅读模式
请问高手:
1. hashcode()是干什么用的?
2. 如果我实现了comparable接口,重写了equals(),为什么还要重写hashCode()呢?默认的equals()是比的hashCode吗?hashCode是基于内存地址计算出来的,可是一个类的两个实例是放在堆区不同的地址空间的,为什么计算出的hash码还是一样的呢?
3. comparable接口里的compareTo()就是用于供系统回调实现自定义排序的吗?那Comparator接口中的compare()呢?它们的异同?系统什么时侯会回调comparare方法呢?

看JDK看的我云里雾里的。百思不得其解,还望哪位好心人能指点一二,在此跪谢了!
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-8 22:09:01 | 显示全部楼层
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-9 09:09:02 | 显示全部楼层
楼上能不能说点自己的见解!
全部粘贴中文API里的原文有用吗?
就是看文档,不太理解才问的!你有全给人家粘贴一遍!
回复

使用道具 举报

1

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-1-9 17:00:01 | 显示全部楼层
就是就是
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-10 09:54:01 | 显示全部楼层
1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有
例如内存中有这样的位置
0  1  2  3  4  5  6  7  
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。
但如果用hashcode那就会使效率提高很多。
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除8求余数直接找到存放的位置了。

2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。
也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
那么。重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊
3。你要对A类排序,有两种方法,一种就是让A类实现comparabole结构并实现compareTo()方法,那么可以通过Collections.sort(List<A> list)对其进行排序
另一种方法:自己定义一个类B实现Comparator类并实现compare方法,
然后通过Collections.sort(List<A> list,B b)进行排序
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-10 22:00:01 | 显示全部楼层
hashCode()是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,(这一段在 Java编程思想 中讲的很清楚的)象util包中的 带 hash 的集合类都是用这种存储结构 :HashMap,HashSet, 他们在将对象存储时(严格说是对象引用),需要确定他们的地址吧, 而HashCode()就是这个用途的,一般都需要重新定义它的,因为默认情况下,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数,这一般是通过将该对象的内部地址转换成一个整数来实现的,现在举个例子来说, 就拿HashSet来说 ,在将对象存入其中时,通过被存入对象的 hashCode() 来确定对象在 HashSet 中的存储地址,通过equals()来确定存入的对象是否重复,hashCode() ,equals()都需要自己重新定义,因为hashCode()默认前面已经说啦,而equals() 默认是比较的对象引用,你现在想一下,如果你不定义equals()的话,那么同一个类产生的两个内容完全相同的对象都可以存入Set,因为他们是通过equals()来确定的,这样就使得HashSet 失去了他的意义,看一下下面这个:
import java.util.*;
class A
{
        private int i;
        public A(int i){
                this.i = i;
        }
        public String toString(){
                return " "+i;
        }
        public boolean equals(Object o){
                A a = (A)o;
                return (a.i==i) ? true : false ;
        }
        public int hashCode(){
                return i;
        }


}

public class TestA
{
        public static void main(String[] args){
                HashSet set = new HashSet();
                for(int i = 0;i<=3;i++)
                        set.add(new A(i));
                System.out.println(set);
                set.add(new A(1));
                System.out.println(set);
                System.out.println(set.contains(new A(0)));
                System.out.println(set.add(new A(1)));
                System.out.println(set.add(new A(4)));
                System.out.println(set);


        }

}
你分别注释掉hashCode()和 equals()来比较一下他们作用就可以拉,关键要自己动手看看比较的结果你就可以记得很清楚啦

回复

使用道具 举报

3

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-1-17 15:00:01 | 显示全部楼层
mark
回复

使用道具 举报

0

主题

39

帖子

23.00

积分

新手上路

Rank: 1

积分
23.00
发表于 2020-1-18 11:54:01 | 显示全部楼层
FYI:http://blog.csdn.net/axman/category/64977.aspx
回复

使用道具 举报

3

主题

17

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-1-19 11:54:01 | 显示全部楼层
hashcode必须结合equals使用,HashMap的性能就靠他们了
回复

使用道具 举报

1

主题

51

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-1-19 13:54:01 | 显示全部楼层
我考都是GOOGLE出来的啊..
hashcode和equals是帮定关系,一般不常用.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表