ToString:身份哈希码的十六进制表示形式

我以前在方便的Apache Commons ToStringBuilder上写过博客,最近有人问我,在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码,但与他实例的哈希码不匹配。

我解释说ToStringBuilder将十六进制格式的身份哈希码添加到其输出中。 在本文中,我将更深入地研究ToStringBuilder对以十六进制格式显示的身份哈希码的使用。 甚至那些不使用ToStringBuilder也可能会发现此信息很有用,因为Java的标准Object.toString()也使用有效表示其身份哈希码的十六进制表示形式。

我将从使用ToStringBuilder一个非常简单的Java示例开始。 本示例使用下面显示的三个Java类( Person.javaEmployee.javaMain.java )。

人.java

package dustin.examples;import org.apache.commons.lang.builder.ToStringBuilder;/*** A simple representation of a Person intended only to demonstrate Apache* Commons ToStringBuilder.* * @author Dustin*/
public class Person
{/** Person's last name (surname). */protected final String lastName;/** Person's first name. */protected final String firstName;/*** Parameterized constructor for obtaining an instance of Person.* * @param newLastName Last name of new Person instance.* @param newFirstName First name of new Person instance.*/public Person(final String newLastName, final String newFirstName){this.lastName = newLastName;this.firstName = newFirstName;}/*** Provide String representation of this Person instance.* @return My String representation.*/@Overridepublic String toString(){final ToStringBuilder builder = new ToStringBuilder(this);builder.append("First Name", this.firstName);builder.append("Last Name", this.lastName);return builder.toString();}
}

Employee.java

package dustin.examples;import java.util.Objects;
import org.apache.commons.lang.builder.ToStringBuilder;/*** Simple class intended to demonstrate ToStringBuilder.* * @author Dustin*/
public class Employee extends Person
{/** Employee ID. */private final String employeeId;/*** Parameterized constructor for obtaining an instance of Employee.* * @param newLastName Last name of the employee.* @param newFirstName First name of the employee. * @param newId Employee's employee ID.*/public Employee(final String newLastName, final String newFirstName, final String newId){super(newLastName, newFirstName);this.employeeId = newId;}/*** Provide String representation of me.** @return My String representation.*/@Overridepublic String toString(){final ToStringBuilder builder = new ToStringBuilder(this);builder.appendSuper(super.toString());builder.append("Employee ID", this.employeeId);return builder.toString();}/*** Simple object equality comparison method.* * @param obj Object to be compared to me for equality.* @return {@code true} if the provided object and I are considered equal.*/@Overridepublic boolean equals(Object obj){if (obj == null){return false;}if (getClass() != obj.getClass()){return false;}final Employee other = (Employee) obj;if (!Objects.equals(this.employeeId, other.employeeId)){return false;}return true;}/*** Hash code for this instance.* * @return My hash code.*/@Overridepublic int hashCode(){int hash = 3;hash = 19 * hash + Objects.hashCode(this.employeeId);return hash;}
}

Main.java(版本1)

package dustin.examples;import static java.lang.System.out;/*** Simple class enabling demonstration of ToStringBuilder.* * @author Dustin*/
public class Main
{/*** Main function for running Java examples with ToStringBuilder.* * @param args the command line arguments*/public static void main(String[] args){final Person person = new Person("Washington", "Willow");out.println(person);final Employee employee = new Employee("Lazentroph", "Frank", "56");out.println(employee);}
}

上面的例子很简单,其输出如下所示:

上面描述的输出显示了为ToStringBuilder生成的两个实例的输出所打印的字符串。 Person类实例的字符串表示形式包括字符串“ 1f5d386”,而Employee类实例的字符串表示形式包括字符串“ 1c9b9ca”。 这些字符串是每个对象的身份哈希码的十六进制表示形式 。

字符串“ 1f5d386”和“ 1c9b9ca”看起来不像我们中的很多人习惯的整数哈希码,因为它们以十六进制表示。 Integer.toHexString(int)方法[自JDK 1.0.2起可用]是一种方便的方法,用于以十六进制格式打印整数,可用于转换“常规”哈希码以查看它们是否与ToStringBuilder生成的哈希码匹配。 我已经在Main类的新版本中的实例的哈希码上添加了对该方法的调用。

Main.java(版本2)

package dustin.examples;import static java.lang.System.out;/*** Simple class enabling demonstration of ToStringBuilder.* * @author Dustin*/
public class Main
{/*** Main function for running Java examples with ToStringBuilder.* * @param args the command line arguments*/public static void main(String[] args){final Person person = new Person("Washington", "Willow");out.println(person);out.println("\tHash Code (ten): " + person.hashCode());out.println("\tHash Code (hex): " + Integer.toHexString(person.hashCode()));final Employee employee = new Employee("Lazentroph", "Frank", "56");out.println(employee);out.println("\tHash Code (ten): " + employee.hashCode());out.println("\tHash Code (hex): " + Integer.toHexString(employee.hashCode()));}
}

执行以上操作会导致以下输出:

如输出所示, Person实例的哈希码的十六进制表示确实与该实例的ToStringBuilder生成的String中显示的匹配。 但是,不能对Employee实例说同样的话。 区别在于Person类不会覆盖hashCode()方法 ,因此默认情况下使用身份哈希码,而Employee类却覆盖其自己的hashCode() (因此与身份哈希码不同)。

Main的第三个版本使用System.identityHashCode(Object)输出身份哈希码[在我的博客文章Java的System.identityHashCode中进一步详细讨论]。

Main.java(版本3)

package dustin.examples;import static java.lang.System.out;/*** Simple class enabling demonstration of ToStringBuilder.* * @author Dustin*/
public class Main
{/*** Main function for running Java examples with ToStringBuilder.* * @param args the command line arguments*/public static void main(String[] args){final Person person = new Person("Washington", "Willow");out.println(person);out.println("\tHash Code (ten): " + person.hashCode());out.println("\tHash Code (hex): " + Integer.toHexString(person.hashCode()));out.println("\t\tIdentity Hash (ten): " + System.identityHashCode(person));out.println("\t\tIdentity Hash (hex): " + Integer.toHexString(System.identityHashCode(person)));final Employee employee = new Employee("Lazentroph", "Frank", "56");out.println(employee);out.println("\tHash Code (ten): " + employee.hashCode());out.println("\tHash Code (hex): " + Integer.toHexString(employee.hashCode()));out.println("\t\tIdentity Hash (ten): " + System.identityHashCode(employee));out.println("\t\tIdentity Hash (hex): " + Integer.toHexString(System.identityHashCode(employee)));}

现在,我们可以将身份哈希码与ToStringBuilder生成的字符串进行比较。

最后一个示例明确地说明ToStringBuilder在其生成的输出中包括系统标识哈希码的十六进制表示。 如果要使用覆盖的哈希码而不是标识哈希码的十六进制表示形式,则可以使用ToStringStyle的实例(通常是StandardToStringStyle的实例),并且可以使用false参数调用方法setUseIdentityHashCode(boolean) 。 此实例ToStringStyle然后可以被传递到ToStringBuilder.setDefaultStyle(ToStringStyle)方法。

附带说明一下,上面显示的Employee类中的equals(Object)和hashCode()方法是由NetBeans 7.1自动生成的。 我很高兴地看到,该项目的Java源代码版本指定为JDK 1.7 ,这两种方法的自动生成利用了Objects类。

在本文中,我一直使用ToStringBuilder生成的输出来促进对身份哈希码的十六进制表示形式的讨论,但是我可以简单地将JDK自己内置的“默认” Object.toString()实现用于同一目的。 实际上,Javadoc甚至宣传了这一点:

Object类的toString方法返回一个字符串,该字符串包括该对象是其实例的类的名称,符号字符“ @”以及该对象的哈希码的无符号十六进制表示形式。 换句话说,此方法返回的字符串等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

我没有使用此示例开始的唯一原因是,我几乎总是在类中重写toString()方法 ,并且未获得此“默认”实现。 但是,当我使用ToStringBuilder实现重写的toString()方法时,确实看到了这些十六进制表示形式。 我可能会增加对Objects.toString()的使用,从而减少对ToStringBuilder使用。

我们中的许多人在日常的Java工作中都不会考虑十六进制表示形式或标识哈希码。 在此博客文章中,我以ToStringBuilder的输出为借口来更仔细地研究这两个概念。 在此过程中,我还简要介绍了Integer.toHexString(Object)方法,该方法对于以十六进制表示形式打印数字很有用。 了解Java对十六进制表示法的支持很重要,因为Java确实会出现在toString()输出 , 颜色标签 , 内存地址和其他地方。

参考: ToString: JCG合作伙伴提供 的身份哈希码的十六进制表示形式   实际事件启发博客中的达斯汀·马克思。


翻译自: https://www.javacodegeeks.com/2012/03/tostring-hexadecimal-representation-of.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS笔记 CSS中级 缩写入门

盒子模型代码简写回忆盒模型时外边距(margin)、内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左。语法:margin:10px 15px 12px 14px;/*上设置为10px、右设置为15px、下设置为12px、左设置为14px*/通常有三种缩写的方法:1、…

JavaScript学习随记——常见全局对象属性及方法

<script type"text/javascript" charset"utf-8">//全局对象&#xff1a; Object、Array、Math等/*** 全局的方法&#xff1a;* 1.encodeURI、escape、decodeURIComponet 编码* 2.decodeURI、unescape、encodeURIComponet 解码* 3.parseInt、parseF…

spring boot 定时任务

package com.ict.conf; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled;Configuration EnableScheduling // 启用定时任务 …

搬运机器人举杯贺所需的条件_智能搬运机器人比赛规则

附件4&#xff1a;分拣机器人(智能搬运机器人)比赛规则1、比赛目的设计一个轮式或人形小型机器人&#xff0c;在比赛场地里移动&#xff0c;将不同颜色、形状或者材质的物体分类搬运到不同的对应位置。比赛的记分根据机器人将物体放置的位置精度和完成时间来决定分值的高低。它…

我们多么想要新的Java日期/时间API?

当前的Java.net 民意测验问题是&#xff1a;“ 对于用Java 8实现的JSR-310&#xff08;新的日期和时间API&#xff09;有多重要&#xff1f; ”在我撰写本文时&#xff0c;将近150位受访者投了赞成票&#xff0c;绝大多数人回答“非常”&#xff08;53&#xff05;&#xff09;…

JavaScript学习随记——Function

每个函数都是Function类型的实例&#xff0c;而且都与其他引用类型一样具有属性和方法。由于函数是对象&#xff0c;因此函数名实际上也是一个指向函数对象的指针&#xff0c;不会于某个函数绑定。 函数的定义方式 <script type"text/javascript" charset"ut…

登录id 黑苹果_黑苹果MacOSCatalina无法登录AppStore修复

先上图&#xff1a;惨红色的提示信息&#xff0c;把你拒之App Store门外&#xff0c;但是对之放弃、不与之斗争不是我们的节奏&#xff0c;请看破敌攻略&#xff1a;1.查看你的“关于本机”-->“概览”-->“系统报告”&#xff0c;如图&#xff1a;找到你的“网络”-->…

我们三十以后才明白

当我们懂得珍惜时光的时候,已经发现自己不再年轻. 三十岁,才慢慢的明白. 男女三十而立&#xff0c;三十岁应该是人生的转折点&#xff0c;它不是青春韶华的终结&#xff0c;而是生命的第二起跑线。 三十岁&#xff0c;面对的不应该是没落&#xff0c;而是认知的新起点。很多曾…

Web开发的入门指导

Web开发的入门指导web开发编程技术你点开此文&#xff0c;说明你对Web开发是有兴趣的&#xff0c;或者你正在思考开始学习Web开发。在这里&#xff0c;我会告诉你成为一名Web开发者的路线&#xff0c;是对初学者关于Web开发的指导。这篇文章不会教你如何写代码&#xff0c;而是…

新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴

南京航空航天大学mti初试417分排名第一:‌基础英语88:1&#xff0c;外刊阅读:从2月到6月开始一直打卡外刊app&#xff0c;友邻优课&#xff0c;流利阅读等2&#xff0c;背单词:扇贝单词app&#xff0c;新东方专八单词绿皮书&#xff0c;华研专八单词等3&#xff0c;星火专八阅读…

JavaScript学习随记——属性类型

<!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>属性类型</title></head> <body><script type"text/javascript" charset"…

Shell if else语句

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句&#xff1a; if ... fi 语句&#xff1b;if ... else ... fi 语句&#xff1b;if ... elif ... else ... fi 语句。1) if ... else 语句 if ... else 语句的语法&#xff1a; if [ ex…

过滤日志中不相关的堆栈跟踪行

我喜欢堆栈痕迹。 不是因为我喜欢错误&#xff0c;而是因为发生错误的那一刻&#xff0c;堆栈跟踪是无价的信息源。 例如&#xff0c;在Web应用程序中&#xff0c;堆栈跟踪向您显示完整的请求处理路径&#xff0c;从HTTP套接字到过滤器&#xff0c;Servlet&#xff0c;控制器&a…

Can't create/write to file '/tmp/#sql_887d_0.MYD' (Errcode: 17)

lsof |grep "#sql_887d_0.MYD" 如果没有被占用就可以删掉 。 https://wordpress.org/support/topic/cant-createwrite-to-file-error Hello, just today I saw this kind of error on every page on my blog. WordPress database error: [Cant create/write to file …

python3怎么创建文件_Python3.5 创建文件的简单实例

实例如下所示&#xff1a;#codingutf-8Created on 2012-5-29author: xiaochouimport osimport timedef nsfile(s):The number of new expected documents#判断文件夹是否存在&#xff0c;如果不存在则创建b os.path.exists("E:\\testFile\\")if b:print("File …

Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

上周我们介绍了神奇的只有五行的 Floyd 最短路算法&#xff0c;它可以方便的求得任意两点的最短路径&#xff0c;这称为“多源最短路”。本周来来介绍指定一个点&#xff08;源点&#xff09;到其余各个顶点的最短路径&#xff0c;也叫做“单源最短路径”。例如求下图中的 1 号…

JavaScript学习随记——错误类型

错误类型&#xff1a; 执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型&#xff0c;而当错误发生时&#xff0c;就会抛出相应类型的错误对象。 ECMA-262定义的7种错误类型 Error&#xff1a; 是错误的基类型&#xff0c;其他错误类型都继承该类型。Error…

多个集合中的共同和独特元素

本周&#xff0c;我们将暂时中断较高级别的问题和技术文章&#xff0c;以解决我们中许多人可能面临的一些代码问题。 没什么花哨的或太辛苦的&#xff0c;但是有一天它可能会节省您15分钟的时间&#xff0c;偶尔回到基础上也很不错。 因此&#xff0c;让我们开始吧。 有时&…

2016给自己一个交代

一、前言 在关于技术上的学习&#xff0c;常常有这样那样的计划&#xff0c;而最终一个都没有真正的落实。零散的学习&#xff0c;终究需要系统总结&#xff0c;才能使自己有所沉淀。从毕业至今&#xff0c;我一直在忙碌&#xff0c;为公司付出自己的很多很多&#xff0c;却只不…

洛克人红色思考型机器人叫什么_稻船敬二新企划《红色灰烬》 依然是机器人风格...

稻船敬二离开CAPCOM之后玩家们纷纷感叹《洛克人》系列将再无续作&#xff0c;不过在单飞的这段时间里&#xff0c;稻船敬二还是创作了诸如《苍蓝雷霆 刚巴尔特》《Mighty No.9》等类似洛克人风格的作品。其名下的团队comcept的最新作《Mighty No.9》即将于9月18日发售&#xff…