关于Object中几个方法的override整理

         在写这篇整理的笔记前,我尝试着去用英文表达,不是想炫耀我的e文,而是因为一,想锻炼一下自己的e文,二则是用英文来表达觉得会更准确些。可惜的是,才写了大概三百字的样子,发现自己写不下去了,最后还是决定用母语来写比较好。至少能写全!老外的技术好,但老外的语言未必牛比啊……
         今天我想整理一下的是:关于Object类中的部分方法的覆写(override)
       (在我觉得我的中文表述没那么准确的时候,我会尝试着用英文来确定一下意思。)
         java中所有的类都有一个父类,那就是Object类,Object类中又有几个特殊的方法:clone(), equals(), hashcode(), finalize(), toString()。
         我要说的主要是equals()和hashcode()这两个方法。这两个方法Object类都有自己的实现,也就是说,如果你自己定义的类没有覆写这两个方法的话,当用到的时候,会上转型到Object类来执行Object已经定义好了的这两个方法。然而,我想说的是,必要的时候我们需要去覆写这两个方法。那么为什么?什么时候覆写?怎么样覆覆写?就是我接下来要写的东西了。
         当我们定义的类是作为一种数据类型,也就是这个类不是一个工具类而是一个数据类的时候,那么我们就会在很多的时候需要对数据之间进行比较,也就是需要用到equals()来判断两数据对象是否equal。同样,作为数据对象,我们也有需要将它作为hashtable的Key来进行存储的时候,那么这个时候我们为了根据这个数据对象来put和get相应的value的时候,就需要用到hashcode()方法,来得到一个准确的entry。所以为了能够正确的实现这些,我们就有必要去覆写Object类已经写好了的equals()和hashcode()方法。
         为什么要覆写equals方法?Object类中定义的equals方法判断两个对象是否equal是根据这个两个引用所指向的对象是否是同一个对象来判断的,这里就存在很严重的问题,有些时候两个对象id不同,但是它们包含的数据状态却是相同的,然后我们也认为它们是equal的,但是依据Object的equals方法判断却返回是false,这个时候问题就出现了。比如:String类。所以我们要覆写equals方法。
         怎么去覆写equals方法呢?这个就比较简单,当考虑两个数据对象是否equal的时候,我们可以对它们各自的内部数据状态来判断。
         为什么要覆写hashcode方法?Object类中定义的hashcode方法计算对象的hash值是根据数据对象的类以及它在内存中的存储位置(也可以说是根据这个对象的id,因为对象的id就是根据它在内存的位置来获得的)来算的。依据equals方法的contact,两个对象如果equal,那么它们的hashcode必须equal,所以,当你覆写了equals方法以后,就必须覆写hashcode方法,否则就会存在存入hashtable中的东西丢失的问题了。
         那么怎么样去覆写hashcode()方法呢?如果你定义的类是immutable的,那么比较简单,直接用对象内的数据以及一定的规则(自己随便的去想,想的结果的好坏不影响终极结果,只是可能会影响一点hash的效率)算个hash值就ok了,但是如果你的类是个mutable类,那么情况就有点复杂,可能以后在程序中还会出现一些“莫名”的错误,原因就是:当你的对象是mutable的时候,你仍然是依据对象中的data来算的hash值,然而在此间,你却modify了对象中的data,以至于在你依据data想retrieve希望得到的value的时候,由于data变了,hashcode()也就变了,然后就无法获得原来的存入的值了。这个时候具体的也不好怎么办?可以考虑对data做修改的时候采取clone()方法,也就是只modify对象的copy。或者当你实在没办法的时候,你就直接定义你的hashcode()返回一个固定的值。只是hash效率不那么好,但仍然可以达到效果。而且不会出错!
         写到这里,我已经有些急了,因为我该收拾收拾快点下班了,想我的honey了。呵呵!OK!基本意思已经完全出来了。可能只有我自己看的懂,不过没关系,这个本来就是给我自己看的。呵呵!当然,也有可能我的一些好朋友会碰巧看到,要是看的懂的话,希望对你们也有点帮助。
         

转载于:https://www.cnblogs.com/keer/archive/2007/05/25/759977.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值