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

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

  1. import java.util.HashSet;
  2. import java.util.Set;
  3.  
  4. public class CheckSystemIdentity {
  5. public static void main(String args[]) {
  6. //声明set对象
  7. Set<Integer> hashSet = new HashSet<Integer>(1024);
  8. //通过循环遍历,检查生成的hashCode是否存在重复的现象
  9. int colls = 0;
  10. int cycleSize=1000000;
  11. for (int n = 0; n < cycleSize; n++) {
  12. Integer obj = new Integer(666);
  13. int identityHashCode = System.identityHashCode(obj);
  14. //System.out.println("identityHashCode is : "+identityHashCode);
  15. Integer hashValue = Integer.valueOf(identityHashCode);
  16. //System.out.println("hashValue is : "+hashValue+"\n");
  17. if (hashSet.contains(hashValue)) {
  18. System.err.println("System.identityHashCode() collision!");
  19. colls++;
  20. }
  21. else {
  22. hashSet.add(hashValue);
  23. }
  24. }
  25. //System.out.println("Integer.MAX_VALUE is : "+Integer.MAX_VALUE+"\n");
  26. System.out.println("created "+cycleSize+" different objects - " + colls + " times with the same value for System.identityHashCode()");
  27. }
  28.  
  29. }

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

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

  1. import java.util.Hashtable;
  2. import java.util.Map;
  3.  
  4. public class HashCodeTest{
  5. //试验对象,没有重写hashCode()方法
  6. static class DummyObject{ }
  7.  
  8. public static void reportClash(DummyObject obj1, DummyObject obj2) {
  9. System.out.println("obj1.hashCode() = " + obj1.hashCode());
  10. System.out.println("obj2.hashCode() = " + obj2.hashCode());
  11. System.out.println("(obj1 == obj2) = " + (obj1 == obj2) + " (!)");
  12. }
  13.  
  14. public static void main(String[] args) {
  15. Map<Integer,DummyObject> map = new Hashtable<Integer ,DummyObject>();
  16. //通过死循环,检查生成的hashCode是否存在重复的情况
  17. for (int count = 1; true; count++) {
  18. DummyObject obj = new DummyObject();
  19. if (map.containsKey(obj.hashCode())) {
  20. System.out.println("Clash found after instantiating " + count + " objects.");
  21. reportClash(map.get(obj.hashCode()), obj);
  22. System.exit(0);
  23. }
  24. System.out.println("The method execute " + count + " and the object hashCode is "+obj.hashCode());
  25. map.put(obj.hashCode(), obj);
  26. }
  27. }
  28. }

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

  1. import java.util.Hashtable;
  2. import java.util.Map;
  3.  
  4. public class HashCodeTest {
  5.  
  6. public static void reportClash(String obj1, String obj2) {
  7. System.out.println("obj1.hashCode() = " + obj1.hashCode());
  8. System.out.println("obj2.hashCode() = " + obj2.hashCode());
  9. System.out.println("(obj1 == obj2) = " + (obj1 == obj2) + " (!)");
  10. }
  11.  
  12. public static void main(String[] args) {
  13. Map<Integer,String> map = new Hashtable<Integer ,String>();
  14. //通过死循环,检查生成的hashCode是否存在重复的情况
  15. for (int count = 1; true; count++) {
  16. String obj = new String();
  17. if (map.containsKey(obj.hashCode())) {
  18. System.out.println("Clash found after instantiating " + count + " objects.");
  19. reportClash(map.get(obj.hashCode()), obj);
  20. System.exit(0);
  21. }
  22. System.out.println("The method execute " + count + " and the object hashCode is "+obj.hashCode());
  23. map.put(obj.hashCode(), obj);
  24. }
  25. }
  26. }

 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. 在Excel中输入超过10的带圈数字

    通过改变字体,可以在excel中输入1-20的带圈数字.对于某些人这些还不够用,那怎么办呢? 有了下面这个不知道是哪个大神做的字体,你就可以直接输到100啦 将字体文件文件粘贴至“C:\WINDOWS ...

  2. 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息

    随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...

  3. [Canvas]人物型英雄出现(前作仅为箭头)

    源码点此下载,用浏览器打开index.html观看. 代码: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...

  4. [信息检索] 第一讲 布尔检索Boolean Retrieval

    第一讲 布尔检索Boolean Retrieval 主要内容: 信息检索概述 倒排记录表 布尔查询处理 一.信息检索概述 什么是信息检索? Information Retrieval (IR) is ...

  5. php5.3升级脚本

    在lanmp/wdcp/wdOS的当前版本中,默认的php都是用到5.2.17的版本如需要升级到php5.3的,可使用如下脚本升级(注:此升级无安全漏洞等原因,只为某些追求高版本或应用需求需要高版本, ...

  6. SpringBoot 启动错误搜集

    Spring Boot:The Bean Validation API is on the classpath but no implementation could be found https:/ ...

  7. 分享一个CSS+JavaScript框架materializecss

    一.内容: CSS+JavaScript框架materializecss. 二.网址:http://materializecss.com 三.图片:

  8. Memcached常用命令及使用说明——netcat

    数据存储(假设key为test,value为12345) printf "set test 0 0 5\r\n12345\r\n" | nc 127.0.0.1 12000 STO ...

  9. MySQL 内存和CPU优化相关的参数

    mysql> SHOW GLOBAL STATUS LIKE 'innodb%read%'; +---------------------------------------+--------- ...

  10. px 和 em 的区别

    相同点:px和em都是长度单位: 异同点:px的值是固定的,指定是多少就是多少,计算比较容易.em得值不是固定的,并且em会继承父级元素的字体大小.浏览器的默认字体高都是16px.所以未经调整的浏览器 ...