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

1-1:hashCode方法相关

1-2:identityHashCode()方法相关

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

import static java.lang.System.out;
/**
* 一个对象的hashCode和identityHashCode 的关系:
* 1:对象的hashCode,一般是通过将该对象的内部地址转换成一个整数来实现的
* 2:当一个类没有重写Object类的hashCode()方法时,它的hashCode和identityHashCode是一致的
* 3:当一个类重写了Object类的hashCode()方法时,它的hashCode则有重写的实现逻辑决定,此时的hashCode值一般就不再和对象本身的内部地址有相应的哈希关系了
* 4:当null调用hashCode方法时,会抛出空指针异常,但是调用System.identityHashCode(null)方法时能正常的返回0这个值
* 5:一个对象的identityHashCode能够始终和该对象的内部地址有一个相对应的关系,从这个角度来讲,它可以用于代表对象的引用地址,所以,在理解==这个操作运算符的时候是比较有用的
*
*/ public class HashCodeTestMain
{
/**
* 输出对象重写的hashCode和唯一的hashCode
* @param object
*/
public static void printHashCodes(final Object object)
{
//输入对象的数据类型,以及调用toString()方法后返回的字符串形式,当对象为空时,此处输出null
out.println("\nThe object type is : " + (object != null ? object.getClass().getName() : "null") + "\nThe object value is : "+String.valueOf(object));
//输出对象的hashCode值,当对象为空时,此处输出N/A
out.println("Overridden hashCode : " + (object != null ? object.hashCode() : "N/A"));
//输出对象的identityHashCode值,如果对应的类没有重写Object类的hashCode()方法,则和默认的hashCode值一致
out.println("Identity hashCode : " + System.identityHashCode(object));
} /**
* 主函数,程序执行的入口
* @param arguments
*/
public static void main(String[] arguments)
{
//基本数据类型的测试数据
final byte _byte = 6;
final char _char = 's';
final short _short = 6;
final int _int = 6;
final long _long = 6L;
final float _float = 6;
final double _double= 6;
final boolean _boolean = true; //包装类型的测试数据
final Byte _Byte = 9;
final Character _Character = 'S';
final Short _Short = 9;
final Integer _Integer = 9;
final Long _Long = 9L;
final Float _Float = 9F;
final Double _Double = 9D;
final Boolean _Boolean = false; //字符串类型的测试数据
final String someString = "someString";
//null
final String nullString = null;
//自定义的测试对象
final User user = new User(666,"godtrue"); //基本数据类型的测试数据
out.println("\n测试基本数据类型的数据");
printHashCodes(_byte);
printHashCodes(_char);
printHashCodes(_short);
printHashCodes(_int);
printHashCodes(_long);
printHashCodes(_float);
printHashCodes(_double);
printHashCodes(_boolean); //包装类型的测试数据
out.println("\n测试包装数据类型的数据");
printHashCodes(_Byte);
printHashCodes(_Character);
printHashCodes(_Short);
printHashCodes(_Integer);
printHashCodes(_Long);
printHashCodes(_Float);
printHashCodes(_Double);
printHashCodes(_Boolean); //字符串类型的测试数据
out.println("\n测试字符串类型的数据");
printHashCodes(someString); //null
out.println("\n测试null空对象");
printHashCodes(nullString); //自定义的测试对象
out.println("\n测试自定义对象,构造此类的时候没有重写它的hashCode()方法");
printHashCodes(user);
}
}

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

public class User {
private Integer id;
private String name; public User() {
} public User(Integer id ,String name) {
this.id = id;
this.name = name;
} @Override
public String toString() {
final StringBuffer sb = new StringBuffer("{\"User\":{");
sb.append("\"id\":\"").append(id).append("\"").append(",");
sb.append("\"name\":\"").append(name).append("\"");
sb.append("}}");
return sb.toString();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

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

"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

测试基本数据类型的数据

The object type is  : java.lang.Byte
The object value is : 6
Overridden hashCode : 6
Identity hashCode : 692191789 The object type is : java.lang.Character
The object value is : s
Overridden hashCode : 115
Identity hashCode : 748481924 The object type is : java.lang.Short
The object value is : 6
Overridden hashCode : 6
Identity hashCode : 1923976189 The object type is : java.lang.Integer
The object value is : 6
Overridden hashCode : 6
Identity hashCode : 1606535644 The object type is : java.lang.Long
The object value is : 6
Overridden hashCode : 6
Identity hashCode : 732674977 The object type is : java.lang.Float
The object value is : 6.0
Overridden hashCode : 1086324736
Identity hashCode : 397106541 The object type is : java.lang.Double
The object value is : 6.0
Overridden hashCode : 1075314688
Identity hashCode : 1937943358 The object type is : java.lang.Boolean
The object value is : true
Overridden hashCode : 1231
Identity hashCode : 129543857 测试包装数据类型的数据 The object type is : java.lang.Byte
The object value is : 9
Overridden hashCode : 9
Identity hashCode : 1842670188 The object type is : java.lang.Character
The object value is : S
Overridden hashCode : 83
Identity hashCode : 896176329 The object type is : java.lang.Short
The object value is : 9
Overridden hashCode : 9
Identity hashCode : 1732745092 The object type is : java.lang.Integer
The object value is : 9
Overridden hashCode : 9
Identity hashCode : 221024277 The object type is : java.lang.Long
The object value is : 9
Overridden hashCode : 9
Identity hashCode : 1755797876 The object type is : java.lang.Float
The object value is : 9.0
Overridden hashCode : 1091567616
Identity hashCode : 1122108505 The object type is : java.lang.Double
The object value is : 9.0
Overridden hashCode : 1075970048
Identity hashCode : 76255581 The object type is : java.lang.Boolean
The object value is : false
Overridden hashCode : 1237
Identity hashCode : 1727296255 测试字符串类型的数据 The object type is : java.lang.String
The object value is : someString
Overridden hashCode : -1264993755
Identity hashCode : 984217639 测试null空对象 The object type is : null
The object value is : null
Overridden hashCode : N/A
Identity hashCode : 0 测试自定义对象,构造此类的时候没有重写它的hashCode()方法 The object type is : com.jd.test.equ.User
The object value is : {"User":{"id":"666","name":"godtrue"}}
Overridden hashCode : 1826809479
Identity hashCode : 1826809479 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. 命令行下的html转pdf工具wkhtmltopdf

    基于webkit和qt的html转pdf的命令行工具,非常好使 http://code.google.com/p/wkhtmltopdf/ http://www.cnblogs.com/shanyou ...

  2. Awk使用及站点日志分析

    Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...

  3. ArcGIS10.4 Runtime Error R6034

    现在甲方采购的ArcGIS Desktop正版,一般都是较高的版本(10.4或10.4.1),但10.4经常报出C++ Runtime R6034错误. 问题 "Microsoft Visu ...

  4. iOS编程(双语版) - 视图 - Transform(转换)

    视图有一个transform属性,它描述了应该如何绘制该视图. 该属性是CGAffineTransform结构体,它代表了3 x 3的变换矩阵(线性代数). 下面的代码让两个矩形视图旋转45度 (Ob ...

  5. JAVA统计中文的个数

    尝试了一下 不错~ /** * 获取字符串的长度,中文占一个字符,英文数字占半个字符 * * @param value 指定的字符串 * @return 字符串的长度 */ public static ...

  6. IDEA中Gradle插件的使用

    Idea本身已经集成了Gradle插件,你可以在File | Settings | Build, Execution, Deployment | Build Tools | Gradle 下找到 相关 ...

  7. Codeforces Round #234 (Div. 2) :A. Inna and Choose Options

    A. Inna and Choose Options time limit per test 1 second memory limit per test 256 megabytes input st ...

  8. Python使用SSL方式发送QQ邮箱

    #coding:utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header # ...

  9. EF Code First导航属性一对一关系中注意点及配置方法

    //学生 public class Student { [key] public int StId { get; set; } public int SocialSecurityNumber { ge ...

  10. JUC-线程池调度-ScheduledThreadPool

    线程调度使用类:ScheduledExecutorService 创建线程池调度类对象: ScheduledExecutorService pool = Executors.newScheduledT ...