PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 是的。。。自己把自己绕迷了,应该是反过来。hashCode相等,不要求equals为true
作者回复: 这个具体的行为,是取决于set本身的实现的。简单来说,Set接口并没有规定对于相同的元素,是用新的替换老的,还是直接忽略新的。 我看了一下JDK8的实现,HashSet底层是一个HashMap,具体的实现会有一个boolean参数控制是替换老的值还是保留新的值,HashSet最终会使用新的值替换老的值。 但是从程序逻辑上说,既然两个元素是相同的,那么就应该无所谓是谁替换谁,因为俩object是equals的。
作者回复: “这种计算方式一定会保证hash值不重复”这个是不对的。只要是hash,就可以重复。你想象,hashCode是个int,也就是只有int的max value种可能性,String可以是任何值,这俩值域就不对等嘛,String的值域大小远大于int,所以用int表示String的hash值,肯定会重复,别的类型也同理,只要是hash值就可能会重复,这叫hash冲突 对的,后面第二段话我觉得你是知道hash会冲突的撒
作者回复: 是的,完全可以👍
作者回复: 你改成100再试试
作者回复: List没这方面的要求。
作者回复: “Hash值算的只是值的hash, 保证了值不重复” hash算法并不保证值不重复,合格的hash算法应该保证值一样的情况下,hash值也一样。 但是反过来,hash值一样,值不一定一样。 就好像名字。是同一个人,那么名字一定一样;但是名字一样,并不代表一定是同一个人。