1:首先看一下JDk API的观点

1-1:hashCode方法相关

1-2:identityHashCode()方法相关

2:此例的核心程序,对应的观点在注释中已经有所说明,请自己也动手实验一下看看!

  1. import static java.lang.System.out;
  2. /**
  3. * 一个对象的hashCode和identityHashCode 的关系:
  4. * 1:对象的hashCode,一般是通过将该对象的内部地址转换成一个整数来实现的
  5. * 2:当一个类没有重写Object类的hashCode()方法时,它的hashCode和identityHashCode是一致的
  6. * 3:当一个类重写了Object类的hashCode()方法时,它的hashCode则有重写的实现逻辑决定,此时的hashCode值一般就不再和对象本身的内部地址有相应的哈希关系了
  7. * 4:当null调用hashCode方法时,会抛出空指针异常,但是调用System.identityHashCode(null)方法时能正常的返回0这个值
  8. * 5:一个对象的identityHashCode能够始终和该对象的内部地址有一个相对应的关系,从这个角度来讲,它可以用于代表对象的引用地址,所以,在理解==这个操作运算符的时候是比较有用的
  9. *
  10. */
  11.  
  12. public class HashCodeTestMain
  13. {
  14. /**
  15. * 输出对象重写的hashCode和唯一的hashCode
  16. * @param object
  17. */
  18. public static void printHashCodes(final Object object)
  19. {
  20. //输入对象的数据类型,以及调用toString()方法后返回的字符串形式,当对象为空时,此处输出null
  21. out.println("\nThe object type is : " + (object != null ? object.getClass().getName() : "null") + "\nThe object value is : "+String.valueOf(object));
  22. //输出对象的hashCode值,当对象为空时,此处输出N/A
  23. out.println("Overridden hashCode : " + (object != null ? object.hashCode() : "N/A"));
  24. //输出对象的identityHashCode值,如果对应的类没有重写Object类的hashCode()方法,则和默认的hashCode值一致
  25. out.println("Identity hashCode : " + System.identityHashCode(object));
  26. }
  27.  
  28. /**
  29. * 主函数,程序执行的入口
  30. * @param arguments
  31. */
  32. public static void main(String[] arguments)
  33. {
  34. //基本数据类型的测试数据
  35. final byte _byte = 6;
  36. final char _char = 's';
  37. final short _short = 6;
  38. final int _int = 6;
  39. final long _long = 6L;
  40. final float _float = 6;
  41. final double _double= 6;
  42. final boolean _boolean = true;
  43.  
  44. //包装类型的测试数据
  45. final Byte _Byte = 9;
  46. final Character _Character = 'S';
  47. final Short _Short = 9;
  48. final Integer _Integer = 9;
  49. final Long _Long = 9L;
  50. final Float _Float = 9F;
  51. final Double _Double = 9D;
  52. final Boolean _Boolean = false;
  53.  
  54. //字符串类型的测试数据
  55. final String someString = "someString";
  56. //null
  57. final String nullString = null;
  58. //自定义的测试对象
  59. final User user = new User(666,"godtrue");
  60.  
  61. //基本数据类型的测试数据
  62. out.println("\n测试基本数据类型的数据");
  63. printHashCodes(_byte);
  64. printHashCodes(_char);
  65. printHashCodes(_short);
  66. printHashCodes(_int);
  67. printHashCodes(_long);
  68. printHashCodes(_float);
  69. printHashCodes(_double);
  70. printHashCodes(_boolean);
  71.  
  72. //包装类型的测试数据
  73. out.println("\n测试包装数据类型的数据");
  74. printHashCodes(_Byte);
  75. printHashCodes(_Character);
  76. printHashCodes(_Short);
  77. printHashCodes(_Integer);
  78. printHashCodes(_Long);
  79. printHashCodes(_Float);
  80. printHashCodes(_Double);
  81. printHashCodes(_Boolean);
  82.  
  83. //字符串类型的测试数据
  84. out.println("\n测试字符串类型的数据");
  85. printHashCodes(someString);
  86.  
  87. //null
  88. out.println("\n测试null空对象");
  89. printHashCodes(nullString);
  90.  
  91. //自定义的测试对象
  92. out.println("\n测试自定义对象,构造此类的时候没有重写它的hashCode()方法");
  93. printHashCodes(user);
  94. }
  95. }

3:User简单的自定义类,比较简单,没什么可讲的,关键是默认继承Object类,且没有重写hashCode()方法,不过重写了toString()方法

  1. public class User {
  2. private Integer id;
  3. private String name;
  4.  
  5. public User() {
  6. }
  7.  
  8. public User(Integer id ,String name) {
  9. this.id = id;
  10. this.name = name;
  11. }
  12.  
  13. @Override
  14. public String toString() {
  15. final StringBuffer sb = new StringBuffer("{\"User\":{");
  16. sb.append("\"id\":\"").append(id).append("\"").append(",");
  17. sb.append("\"name\":\"").append(name).append("\"");
  18. sb.append("}}");
  19. return sb.toString();
  20. }
  21.  
  22. public String getName() {
  23. return name;
  24. }
  25.  
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. }

4:运行结果如下所示,不同的运行环境结果可能存在差异(win7+jdk7):

  1. "C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.HashCodeTestMain
  2.  
  3. 测试基本数据类型的数据
  4.  
  5. The object type is : java.lang.Byte
  6. The object value is : 6
  7. Overridden hashCode : 6
  8. Identity hashCode : 692191789
  9.  
  10. The object type is : java.lang.Character
  11. The object value is : s
  12. Overridden hashCode : 115
  13. Identity hashCode : 748481924
  14.  
  15. The object type is : java.lang.Short
  16. The object value is : 6
  17. Overridden hashCode : 6
  18. Identity hashCode : 1923976189
  19.  
  20. The object type is : java.lang.Integer
  21. The object value is : 6
  22. Overridden hashCode : 6
  23. Identity hashCode : 1606535644
  24.  
  25. The object type is : java.lang.Long
  26. The object value is : 6
  27. Overridden hashCode : 6
  28. Identity hashCode : 732674977
  29.  
  30. The object type is : java.lang.Float
  31. The object value is : 6.0
  32. Overridden hashCode : 1086324736
  33. Identity hashCode : 397106541
  34.  
  35. The object type is : java.lang.Double
  36. The object value is : 6.0
  37. Overridden hashCode : 1075314688
  38. Identity hashCode : 1937943358
  39.  
  40. The object type is : java.lang.Boolean
  41. The object value is : true
  42. Overridden hashCode : 1231
  43. Identity hashCode : 129543857
  44.  
  45. 测试包装数据类型的数据
  46.  
  47. The object type is : java.lang.Byte
  48. The object value is : 9
  49. Overridden hashCode : 9
  50. Identity hashCode : 1842670188
  51.  
  52. The object type is : java.lang.Character
  53. The object value is : S
  54. Overridden hashCode : 83
  55. Identity hashCode : 896176329
  56.  
  57. The object type is : java.lang.Short
  58. The object value is : 9
  59. Overridden hashCode : 9
  60. Identity hashCode : 1732745092
  61.  
  62. The object type is : java.lang.Integer
  63. The object value is : 9
  64. Overridden hashCode : 9
  65. Identity hashCode : 221024277
  66.  
  67. The object type is : java.lang.Long
  68. The object value is : 9
  69. Overridden hashCode : 9
  70. Identity hashCode : 1755797876
  71.  
  72. The object type is : java.lang.Float
  73. The object value is : 9.0
  74. Overridden hashCode : 1091567616
  75. Identity hashCode : 1122108505
  76.  
  77. The object type is : java.lang.Double
  78. The object value is : 9.0
  79. Overridden hashCode : 1075970048
  80. Identity hashCode : 76255581
  81.  
  82. The object type is : java.lang.Boolean
  83. The object value is : false
  84. Overridden hashCode : 1237
  85. Identity hashCode : 1727296255
  86.  
  87. 测试字符串类型的数据
  88.  
  89. The object type is : java.lang.String
  90. The object value is : someString
  91. Overridden hashCode : -1264993755
  92. Identity hashCode : 984217639
  93.  
  94. 测试null空对象
  95.  
  96. The object type is : null
  97. The object value is : null
  98. Overridden hashCode : N/A
  99. Identity hashCode : 0
  100.  
  101. 测试自定义对象,构造此类的时候没有重写它的hashCode()方法
  102.  
  103. The object type is : com.jd.test.equ.User
  104. The object value is : {"User":{"id":"666","name":"godtrue"}}
  105. Overridden hashCode : 1826809479
  106. Identity hashCode : 1826809479
  107.  
  108. Process finished with exit code 0

5:上面的代码和注释已经抛出了我的观点,代码相对简单,可能还有一些繁琐,不过经过对比更能体现出自己观点的正确性,原本是想写一篇关于==操作符相关的博文的,后来发现要能清楚某些知识点,就需要先弄明白另外一些知识点,经过试验和查阅资料就有了此篇博文了,后续再补上相关联的知识点小结。

hashCode和identityHashCode 的关系的更多相关文章

  1. hashCode和identityHashCode底层是怎么生成的

          前言:在工作中使用==埋下的坑这篇博文的最后,我想到了两个问题,其中一个是——为什么 int int1=99;int int2=99;int1和int2的identityHashCode是 ...

  2. hashCode和identityHashCode的区别你知道吗?

    hashCode 关于hashCode参考之前的文章,点击参考之前文章. identityHashCode identityHashCode是System里面提供的本地方法,java.lang.Sys ...

  3. 深入探究Java中hashCode()和equals()的关系

    目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...

  4. hashCode和equals的关系分析

    hashCode:说白了,简单的就看做一个函数,但是该函数有可能出现:对于某个x值,存在不止一个y值与之对应.这种情况就叫哈希碰撞. 那么: 1.如果hashCode相等,两个对象不一定是同一个对象( ...

  5. java 中hashcode 与 equals的关系

    equals()相等的两个对象,hashcode()一定相等: equals()不相等的两个对象,却并不能证明他们的hashcode()不相等. 反过来: hashcode()不等,一定能推出equa ...

  6. 高强度学习训练第十二天总结:Java hashCode和equals的关系

    今天要收拾东西.草草的总结下.. 1.如果两个对象相等,则hashcode一定也是相同的 2.两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象有相同的hashcode值,它 ...

  7. java中hashCode和equals什么关系,hashCode到底怎么用的

    Object类的hashCode的用法:(新手一定要忽略本节,否则会很惨) 马 克-to-win:hashCode方法主要是Sun编写的一些数据结构比如Hashtable的hash算法中用到.因为ha ...

  8. 两段检验系统生成的identityHashCode是否重复的代码

    前言:承接上一篇hashCode和identityHashCode 的关系,下面的两段简单的程序主要是检验一下系统生成的identityHashCode是否存在重复的情况. 1:可以自由控制生成对象的 ...

  9. ==和equals的简单比较

    前言:==和equals这个两个东西,经常放在一块做比较,下面我也给出一个简单的例子,对他俩进行一个简单的比较,先看例子,然后在看结论.(实验环境:win7+jdk7) 1:==和equals简单比较 ...

随机推荐

  1. 是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?

    错误提示 : 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入 是否缺少对 Microsoft.CSharp.dll 和 System.Core ...

  2. You have version null and I want version 8

    删除hdfs上的/hbasehadoop fs -rm -r /hbase 删除zookeeper上的/hbasezookeeper-client -server 192.168.1.2:2181 r ...

  3. oracle数据分组

    一,什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值 二,分组函数类型 Avg ,count,max,min,stddev(标准方差),sum. 函数名称 函数描述 Count 返回找到 ...

  4. OpenGL 核心技术之立方体贴图

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家.特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  5. 【Zookeeper】源码分析之序列化

    一.前言 在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信.数据存储中都用到了序列化,下面开始分析. 二.序列化 序列化主要在zook ...

  6. Java的一个关于“星球”的枚举

    public enum Planet { /** * 水星 */ MERCURY(3.302e+23, 2.439e6), /** * 金星 */ VENUS(4.869e+24, 6.052e6), ...

  7. 【Linux】cat充当vi使用(特殊用法)

    1.在终端输入cat >b.txt Linux:/qinys/data # cat >b.txt 2.回车后按下ctrl+d组合键即可完成编辑

  8. 关于java线程的daemon的认识

    在 JAVA中的CountDownLatch.CyclicBarrier.Semaphore的简单测试 这文章里说到了线程的daemon问题,特写一篇来分析一下. 上代码: package com.y ...

  9. 转 安装Nginx 1.2.0+PHP 5.4.3(FastCGI)+MySQL 5.5.24

    硬件环境:Dell PowerEdge 1950,4核Intel(R) Xeon(R) CPU E5410  @ 2.33GHz4G内存 系统环境:CentOS release 5.2,内核版本: 2 ...

  10. Android(4.0.3+): Service, AsyncTask, 定时任务和UI通信

    Service使用AlarmManager实现后台定时任务 在Android 4.0.3版本中, 使用AlarmManager实现后台定时任务是比较好的方案, 其实现机制, 是利用Service的 o ...