VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: wccheese

hashCode()的作用

[复制链接]

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-1-20 10:09:02 | 显示全部楼层
楼上的朋友讲的很透彻,但我还是有点疑问:
1. equals()在比较除8大包装类和String类外,比的是引用,在比较这9个类时,
比的不是引用,而是转换为相应的基本类型来比的(除了String-->char[]).
(顺便问一下:为什么StringBuffer没有重写equals()?)

下面是我的理解:
如果没重写equals(),则对象之间比较时会按内存地址比,这样任何类的任何实例都不可能
equals()返回true了.
如果重写了equals()则是用自己定义的方法来比较了.这时即使不重写hashCode()也能
得出正确的比较结果,但这时返回的hashCode就不一样了(一样的可能性非常小),如果只想
比较不干点别的(弄着好玩的),这时hashCode对我们来说并不重要,但是:正如楼上的朋友所说:当要用到散列数据结构来存储和取出数据时,全是通过hashCode来操作的,如果哈希码不一样就不用equal()了,如果哈希码一样再equals()比.如果重写了equals()而没重写hashCode()则会导致equals()为true,但是Set里还会有两个或多个这类对象的引用(因为hashCode不一样).另一个极端情况:
只重写hashCode()但不重写equals(),会导致同一个类的多个相同实例的引用被加到Set里,不同类的实例反倒可能加不进来,因为hashCode一样(虽然机率狂小).
(再顺便问一下:JAVA中是如何计算一个对象的hash码的,不是按内存地址计算的吗?内存地址是唯一的,为什么还可能会出现重复的hash码呢?)
不知道偶的理解对不对?还请高手们指点指点小弟.

2. Comparator 接口中的compare方法产生一个比较器,这个比较器的比较级别高于在Comparable接口中重写的compareTo(),这样理解对吗?

再次跪谢!!
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-20 22:54:01 | 显示全部楼层
1.hashCode()方法使用来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的桶里面,Map在搜索一个对象的时候先通过hashCode()找到相应的桶,然后再根据equals()方法找到相应的对象.要正确的实现Map里面查找元素必须满足一下两个条件:
(1)当obj1.equals(obj2)为true时obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() != obj2.hashCode()为true时obj.equals(obj2)必须为true

2.一个类实现Comparable接口是用来决定该类对象的自然顺序,这样把该类对象放入TreeSet,TreeMap,时会根据该类对象的自然顺序自动进行排序,另外往Queue里面存的时候也会根据对象自然顺序排序

3.光实现Comparable只能决定该类对象自然顺序,但是很多时候需要自定义排序规则,那么就要实现
Comparator接口,例如一个People实现了Comparable接口并且定义自然顺序为按照名字字母顺序排序,那么把People存到List里面的时候可以用Collections.sort()方法根据自然顺序对该List进行排序,问题就在于我现在要把People按照年龄排序该怎么办呢?一个类实现了Comparable只能重写compareTo()方法一次,那么也只能有一种顺序--自然顺序,但是为了可以用age大小排序这个List的话,就必须使用一个类实现Comparator并且重写compare()方法,定义按照age排序的规则,然后调用Collections 的 static <T> void sort(List<T> list, Comparator<? super T> c) 这个方法来按照指定比较器规定的顺序来对List排序
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-21 09:18:01 | 显示全部楼层
上面的条件写错了一点,应该是
(1)当obj1.equals(obj2)为true时obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时obj.equals(obj2)必须为false
回复

使用道具 举报

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-2-5 01:30:01 | 显示全部楼层
多谢高人的指点,受益菲浅,thank you very much ,very much !!
回复

使用道具 举报

1

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-2-7 20:00:01 | 显示全部楼层
好帖
!!!!
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-27 10:00:01 | 显示全部楼层
mark

回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 12:15:01 | 显示全部楼层
jie
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-2 15:45:01 | 显示全部楼层
好帖
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-3 00:30:01 | 显示全部楼层
看不懂啊!还是不清楚啊!
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-3 01:00:01 | 显示全部楼层
好贴
回复

使用道具 举报

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

本版积分规则

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

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