两段检验系统生成的identityHashCode是否重复的代码
前言:承接上一篇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是否重复的代码的更多相关文章
- 洛谷P1121 环状最大两段子段和
题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...
- P1121 环状最大两段子段和
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...
- php 两段文本对比,不同的文字显示高亮
php 两段文本对比,不同的文字显示高亮[下面这个只能区分错误后面的..] <?php $str1 ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg ...
- 两段锁协议(Two-Phase Locking――2PL)
两段锁协议(Two-Phase Locking――2PL) 两段锁协议规定所有的事务应遵守的规则: ① 在对任何数据进行读.写操作之前,首先要申请并获得对该数据的封锁. ② 在释放一个封锁之后,事务不 ...
- 洛谷 P1121 环状最大两段子段和 解题报告
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...
- 谈ObjC对象的两段构造模式
前言 Objective-c语言在申请对象的时,需要使用两段构造(Two Stage Creation)的模式.一个对象的创建,需要先调用alloc方法或allocWithZone方法,再调用init ...
- SPSS-非参数检验—两独立样本检验 案例解析
今天跟大家研究和分享一下:spss非参数检验——两独立样本检验, 我还是引用教程里面的案例,以:一种产品有两种不同的工艺生产方法,那他们的使用寿命分别是否相同 下面进行假设:1:一种产品两种不同的工艺 ...
- [javascript]两段 javaScript 代码的逻辑比较
两段 javaScript 代码的逻辑比较: #1 if(tagName.length < 3){ $(this).parent().addClass('active'); tagN ...
- 两段用来启动/重启Linux下Tomcat的Perl脚本
两段代码,第二段比较好些. 下面是Split输出结果方式的代码: #!/usr/local/bin/perl #Date:2015-07-07 print "Begin to restart ...
随机推荐
- CHtmlEditCtrl (3): More HTML Editor Options
In this version of our HTML Editor, we'll create a floating source view/edit window and we'll implem ...
- Idea不能新建package的解决
右键–>new –> Mark Directory As –> Sources Root (idea需要修改一下目录的性质,改为源文件 )
- Google Java Style 中文版
Google Java Style 中文版 基于官方文档2013.12.19最后一次改动. 翻译人:Weir Zhang (zh.weir) 旁白:水平有限,很多地方只是意译.不准确的地方 ...
- Oracle聚合连接字符串
问题需求 现有一个数据表,如下: ID CODE NAME 1 A 张三 2 A 李四 3 B 王五 4 C 赵六 5 C 孙七 ...
- 我们为什么要使用Spring Cloud?简介
转载:https://blog.csdn.net/smallsunl/article/details/78778790 单体架构 在网站开发的前期,项目面临的流量相对较少,单一应用可以实现我们所需要的 ...
- LoadRunner基于HTML-based script和URL-based script方式录制的区别和各自的使用场景
一.区别: 为了更加直观的区别这两种录制方式,我们可以分别使用这两种方式录制同一场景(打开百度首页)然后进行对比,录制的代码如下: HTML-based script方式打开百度首页: Action( ...
- C# Directory.GetFiles()获取多个类型格式的文件
第一种方式 System.IO.Directory.GetFiles()获取多个类型格式的文件 System.IO.Directory.GetFiles("c:\","( ...
- angularjs的config和interceptor - session注入
config 这个要从config的正确使用说起,也许你想在config某个provider的时候注入$rootscope, 但是这是不允许的,我们细看下面的特性 session注入 每个请求自带se ...
- 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)
目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...
- hdu 4336 概率dp + 状压
hdu 4336 小吃包装袋里面有随机赠送一些有趣的卡片,如今你想收集齐 N 张卡片.每张卡片在食品包装袋里出现的概率是p[i] ( Σp[i] <= 1 ), 问你收集全部卡片所需购买的食品数 ...