易截截图软件、单文件、免安装、纯绿色、仅160KB

Effective Java 学习笔记(9)

通常,有一类问题的产生都是由于没有重载hashCode这个方法. 当你重载equals后,hashCode必须重载,否则在使用HashMap, HashSet, Hashtable的时候,会出错.
对于hashCode有几个原则.
1. 不管什么时候调用hashCode,如果同一个对象与hashCode相关的字段没有修改的话,这个方法的返回值必须相同. 但不必和另一个应用程序中的值相等.
2. 当两个对象equals的时候,其hashCode也必须相同.
3.没有强制两个不一样的对象不能返回相同的hashCode, 但是要注意的,如果Hash表中冲突太多,会降低程序性能.
一个好的hashCode函数,能对不同的对象返回不同的值。写一个好的hashCode不是想像的那么困难,如果参照以下的方法的话:
1. 储存一个非零常量,如17,作为返回值。
2. 对每一个有比较意义的成员,参照以下:
 a. 计算数字型的hash code
     i.  如果是boolean, 计算(f?1:0)
     ii. 如果是byte char,short or int 计算,(int)f
     iii. 如果是long, 计算(int) ( f ^ (f >>>32))
     iv. 如果是float, 计算Float.floatToIntBits(f);
     v. 如果是double, 计算Double.doubleToLongBits(f), 得到长整型数字请参见 iii.
     vi. 如果是个对象的引用,就调用这个对象的hashcode
     vii,如果是数组,就对每个元素按上述原则做。
 b.  计算hashCode 按以下公式。
  result = 31 * result + c;   // c是 上面计算的值
3. 返回值。
4. 写测试用例测试。
要注意的是,你可以在hashCode中忽略一些值,但是同样,这些值也不能在equals中引用。


相关文档:

Java程序员的迷失—论“虚拟机”


Java程序员的迷失—论“虚拟机”
2009年08月  作者:东方蜘蛛译
虚拟机技术现在非常热门,人们认为它可以完成一切事情。人们热衷于让JVM可以运行Ruby、PHP或其它一些热门语言,以及支持像Java FX之类的技术。这种现象是好是坏?Joe Winchester以自己的经历来论证了对此的看法。
在Java出现之前我 ......

设计模式之Factory,Java工厂方法

术语名称:Factory
术语解释:工厂模式,用来提供创建对象的接口.
工厂模式功能的详细解释:
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象 ......

JAVA开源工具大全

Spring Framework  【Java开源 J2EE框架】
Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的 Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用 ......

JAVA开源大全

 
Beanshell  【Java开源 动态语言】
Beanshell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScri ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号