本帖最后由 jy6728228 于 2016-4-29 00:02 编辑
写的这么好居然没人看。
算了,我接下来接着写关于equals和hashCode的问题。
好,首先我们搞清楚了equals是干嘛的。那么hashCode又是什么鬼东西?完全搞不懂好吗?这难道是SUN来逗我们玩的? 我觉得很有可能。
接下来就找一个与hashCode有关的。
HashMap,这玩意听着就跟Hash有关系,我们去看看他的get方法到底干了什么东西。
给出一个小栗子
Dog.java 下面的它的equals和hashCode
那么接下来我们用HashMap的实现去玩一玩这个新东西
运行结果:n u l l
OK,那么问题来了。为什么是NULL值呢?
不是说好的重写等于就可以了吗。SUN 你这个大骗子。
逗爹玩呢。
好吧不管那么多,跟进去看看HashMap里面到底干了一些什么鬼东西。在这样搞我就抓狂啊。。。。。。
接下来去跟进HashMap的get方法
日了狗了,怎么又取Entry,不过这次仍然是自己内里面定义的内部内,不是之前TreeMap里面的了。
接着去看getNode干了啥,应该就是这个逗比没找到我想要的东西,所以才没给我返回。
兔崽子,让我逮住你在哪里了吧。
因为在入口处传了hash值。但是呢,你put进来的hash 不等于我这里取到的hash。所以我返回了null值(Dog类中的hashCode()是故意写成随机很大范围,是为了put和get 传给HashMap的hash值不一样)。
那么最后收官定论。
当出现HashMap,HashSet,LinkedHashList.
跟hash有关的时候,你就必须让Hash的值准确,不能只重写equals却不重写hashCode.
当然你用TreeMap的话就无所谓了。 除了TreeMap。 目前就没看到不是Hash实现的Map。
然而List里面也有Hash实现。
那么只要跟hash有关的实现,那么你就肯定会有错。
当然我们平时更多的是用的String.现在在想想,sun把String写成final是不是就是担心你们这群大傻,重写equals不重写hashCode呢?
那么下面在给一个强制不重写hashCode,但是却要能找到的Map的黑科技。
按照这种写法,你就不会碰到hashCode的问题,然而平时开发并没有谁写这么多费代码,去难为自己吧。
所以呢,你一旦要重写equals请务必重写hashCode,免得别人调用你的类,却发现他妈的到hashMap这里面不能用。
最后留一个QQ:344104344
欢迎吐槽。。。。。。。。。。 |