Failure to do so will result in a violation of the general contract for Object.hashCode, which will prevent your class from functioning properly in conjunction with all hash-based collections, including HashMap, HashSet, and Hashtable.

Simple recipe for override hashCode

1. Store some constant nonzero value, say, 17, in an invariable called result.

2. For each significant field fin your object (each field taken into account by the

equalsmethod, that is), do the following:

a. Compute an inthash code cfor the field:

i. If the field is a boolean, compute (f?1:0).

ii. If the field is a byte,char, short, or int, compute (int) f.

iii. If the field is a long, compute (int) (f ^ (f >>> 32)).

iv. If the field is a float, compute Float.floatToIntBits(f).

v. If the field is a double, compute Double.doubleToLongBits(f), and then hash the resulting long as in step 2.

vi. If the field is an object reference and this class's equals method compares the field by recursively invoking equals, recursively invoke hashCode on the field. If a more complex comparison is required, compute a "canonical representation" for this field and invoke hashCode on the canonical representation. If the value of the field is null, return 0(or some other constant, but 0 is traditional).

vii. If the field is an array, treat it as if each element were a separate field. That is, compute a hash code for each significant element by applying these rules recursively, and combine these values per step 2. If every element in an array field is significant, you can use one of the Arrays.hashCode methods added in release 1.5.

b. Combine the hash code c computed in step 2 into result as follows:

result = 31 * result + c;

3. Return result.

4. When you are finished writing the hashCode method, ask yourself whether equal instances have equal hash codes. Write unit tests to verify your intuition! If equal instances have unequal hash codes, figure out why and fix the problem.

NOTE

If a class is immutable and the cost of computing the hash code is significant, you might consider caching the hash code in the object rather than recalculating it each time it is requested.

// Lazily initialized, cached hashCode

private volatile int hashCode; // (See Item 71)

@Override public int hashCode() {

int result = hashCode;

if (result == 0) {

result = 17;

result = 31 * result + areaCode;

result = 31 * result + prefix;

result = 31 * result + lineNumber;

hashCode = result;

}

return result;

}

最新文章

  1. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——一些有用的Sizzle API
  2. Schema – 模块化,响应式的前端开发框架
  3. performSelector的原理以及用法
  4. AngularJs优缺点
  5. Fiddler 前端工具
  6. IOS笔记之UIKit_UIScrollView
  7. 李洪强-C语言2-字符串
  8. BZOJ 2668 交换棋子(费用流)
  9. Oracle Order Management DropShip Flow for R12
  10. docker 中运行 sshd 服务
  11. 纯代码 自己主动屏幕适配iPhone button
  12. I2C分析三
  13. [Bzoj 2956] 模积和 (整除分块)
  14. influxdb使用说明
  15. GridView 事件出发后 内容滚动条 实时定位
  16. .Net 并发写入文件的多种方式
  17. gevent监测单线程下的io进行切换
  18. hdu 5877 Weak Pair (Treap)
  19. AMD/CMD/CommonJs到底是什么?它们有什么区别?
  20. React Native 打包 Apk

热门文章

  1. Nginx+CI出现404错误
  2. Vue基础---->VueJS的使用(一)
  3. mysqldump: Couldn't execute 'show table status '解决方法
  4. Mysql大量插入随机数据方法--存储过程
  5. List<?>和List<T>的区别?
  6. HTML5定稿一周年,你必须要重新认识HTML5了
  7. 常用vs快捷键
  8. C# Web Forms - Using jQuery FullCalendar
  9. PHP学习笔记:通过curl实现采集网站内容
  10. mysql root强密码的必要性max_allowed_packet被改成1024引起的风险