前言:承接上一篇hashCode和identityHashCode 的关系,下面的两段简单的程序主要是检验一下系统生成的identityHashCode是否存在重复的情况。

1:可以自由控制生成对象的个数,并且不受测试的类是否重写hashCode()方法的影响

import java.util.HashSet;
import java.util.Set; public class CheckSystemIdentity {
public static void main(String args[]) {
//声明set对象
Set<Integer> hashSet = new HashSet<Integer>(1024);
//通过循环遍历,检查生成的hashCode是否存在重复的现象
int colls = 0;
int cycleSize=1000000;
for (int n = 0; n < cycleSize; n++) {
Integer obj = new Integer(666);
int identityHashCode = System.identityHashCode(obj);
//System.out.println("identityHashCode is : "+identityHashCode);
Integer hashValue = Integer.valueOf(identityHashCode);
//System.out.println("hashValue is : "+hashValue+"\n");
if (hashSet.contains(hashValue)) {
System.err.println("System.identityHashCode() collision!");
colls++;
}
else {
hashSet.add(hashValue);
}
}
//System.out.println("Integer.MAX_VALUE is : "+Integer.MAX_VALUE+"\n");
System.out.println("created "+cycleSize+" different objects - " + colls + " times with the same value for System.identityHashCode()");
} }

2:利用死循环来检测系统生成的identityHashCode是否存在重复的情况

2-1:测试类是自定义的,没有重写hashCode()方法

import java.util.Hashtable;
import java.util.Map; public class HashCodeTest{
//试验对象,没有重写hashCode()方法
static class DummyObject{ } public static void reportClash(DummyObject obj1, DummyObject obj2) {
System.out.println("obj1.hashCode() = " + obj1.hashCode());
System.out.println("obj2.hashCode() = " + obj2.hashCode());
System.out.println("(obj1 == obj2) = " + (obj1 == obj2) + " (!)");
} public static void main(String[] args) {
Map<Integer,DummyObject> map = new Hashtable<Integer ,DummyObject>();
//通过死循环,检查生成的hashCode是否存在重复的情况
for (int count = 1; true; count++) {
DummyObject obj = new DummyObject();
if (map.containsKey(obj.hashCode())) {
System.out.println("Clash found after instantiating " + count + " objects.");
reportClash(map.get(obj.hashCode()), obj);
System.exit(0);
}
System.out.println("The method execute " + count + " and the object hashCode is "+obj.hashCode());
map.put(obj.hashCode(), obj);
}
}
}

2-2:测试类是String,重写了hashCode()方法和2-1正好再次的做一下对比

import java.util.Hashtable;
import java.util.Map; public class HashCodeTest { public static void reportClash(String obj1, String obj2) {
System.out.println("obj1.hashCode() = " + obj1.hashCode());
System.out.println("obj2.hashCode() = " + obj2.hashCode());
System.out.println("(obj1 == obj2) = " + (obj1 == obj2) + " (!)");
} public static void main(String[] args) {
Map<Integer,String> map = new Hashtable<Integer ,String>();
//通过死循环,检查生成的hashCode是否存在重复的情况
for (int count = 1; true; count++) {
String obj = new String();
if (map.containsKey(obj.hashCode())) {
System.out.println("Clash found after instantiating " + count + " objects.");
reportClash(map.get(obj.hashCode()), obj);
System.exit(0);
}
System.out.println("The method execute " + count + " and the object hashCode is "+obj.hashCode());
map.put(obj.hashCode(), obj);
}
}
}

 3:程序相对简单,有兴趣的可以自己运行一下看看结果。

      结论如下:

      3-1:在我实验的环境中(win7+jdk7)identityHashCode没有出现重复的现象

      3-2:没有重写的hashCode和identityHashCode是一致的,可以间接的反映一个对象的内存地址是什么

      3-3:identityHashCode能更为准确的代表一个对象和其内存地址的hash关系,

两段检验系统生成的identityHashCode是否重复的代码的更多相关文章

  1. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  2. P1121 环状最大两段子段和

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...

  3. php 两段文本对比,不同的文字显示高亮

    php 两段文本对比,不同的文字显示高亮[下面这个只能区分错误后面的..]   <?php $str1 ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg ...

  4. 两段锁协议(Two-Phase Locking――2PL)

    两段锁协议(Two-Phase Locking――2PL) 两段锁协议规定所有的事务应遵守的规则: ① 在对任何数据进行读.写操作之前,首先要申请并获得对该数据的封锁. ② 在释放一个封锁之后,事务不 ...

  5. 洛谷 P1121 环状最大两段子段和 解题报告

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...

  6. 谈ObjC对象的两段构造模式

    前言 Objective-c语言在申请对象的时,需要使用两段构造(Two Stage Creation)的模式.一个对象的创建,需要先调用alloc方法或allocWithZone方法,再调用init ...

  7. SPSS-非参数检验—两独立样本检验 案例解析

    今天跟大家研究和分享一下:spss非参数检验——两独立样本检验, 我还是引用教程里面的案例,以:一种产品有两种不同的工艺生产方法,那他们的使用寿命分别是否相同 下面进行假设:1:一种产品两种不同的工艺 ...

  8. [javascript]两段 javaScript 代码的逻辑比较

    两段 javaScript 代码的逻辑比较: #1 if(tagName.length < 3){    $(this).parent().addClass('active');    tagN ...

  9. 两段用来启动/重启Linux下Tomcat的Perl脚本

    两段代码,第二段比较好些. 下面是Split输出结果方式的代码: #!/usr/local/bin/perl #Date:2015-07-07 print "Begin to restart ...

随机推荐

  1. 数据驱动测试二:使用TestNG和CSV文件进行数据驱动

    转载:https://blog.csdn.net/heart_1014/article/details/52013173 使用@DataProvider注解定义当前方法中的返回对象CSV文件(存放测试 ...

  2. 通过项目逐步深入了解Mybatis<二>

    Mybatis 解决 jdbc 编程的问题 1. 数据库链接创建.释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题. 解决:在SqlMapConfig.xml中配置数据链接池 ...

  3. Oracle数据表中输入引号等特殊字符

    Oracle输入特殊字符的特殊方法: UPDATE BOOKMARK SET BM_VALUE=q'/ --在这里写下需要输入的内容(可以包括引号.回车等特殊的符号),所见即所得 /' -- WHER ...

  4. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project

    SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...

  5. 使用influx控制台工具操作InfluxDB

    这里记录下influx控制台的简单使用,如需更多功能请参考InfluxDB官方文档: https://docs.influxdata.com/influxdb/v1.1/ 环境: CentOS6.5_ ...

  6. VTK中获取STL模型点的坐标以及对其进行变换

    VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...

  7. django之创建第12个项目-加载图片

    百度云盘:django之创建第12个项目-加载图片 1.setting配置 #静态文件相关配置 # URL prefix for static files. # Example: "http ...

  8. X-Forwarded-For 会少记录一次代理服务器的IP

    X-Forwarded-For是一个Http请求头中的项目. 当一个请求经过代理时,X-Forwarded-For将被记录下来,规则如下: 假设用户U,通过代理服务器A,请求到服务器S, 那么X-Fo ...

  9. 基于RecyclerView实现的分组显示信息demo

    发布时间:2018-11-07   技术:Android Studio 3.1.3+ RecyclerView+sectionRecyclerViewAdapter   概述 利用sectionedR ...

  10. iOS 瀑布流之栅格布局

    代码地址如下:http://www.demodashi.com/demo/14760.html 一 .效果预览 二.确定需求 由下面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的 ...