您的位置:首页 > 移动开发 > Objective-C

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

2007-05-25 17:33 381 查看
在写这篇整理的笔记前,我尝试着去用英文表达,不是想炫耀我的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!基本意思已经完全出来了。可能只有我自己看的懂,不过没关系,这个本来就是给我自己看的。呵呵!当然,也有可能我的一些好朋友会碰巧看到,要是看的懂的话,希望对你们也有点帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: