tostring 16进制_ToString:身份哈希码的十六进制表示形式

tostring 16进制

我以前在方便的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

tostring 16进制

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

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

相关文章

uctools.php,discuz 论坛UCenter无法登录,闪退的终极8种解决办法

最近论坛的UCenter无法登录,闪退的解决办法(密码是正确的)在Discuz官方论坛寻找了无数的解决方法,总结有以下几种:1. 直接在Uc_server修改创始人密码改UC创始人密码。修改UC配置文件 /uc_server/data/config.inc.php对应两行换掉define(UC_FO…

前端工程师应该掌握哪些技能才方便找工作?

作为前端工程师,必须掌握到一定的技能才方便找工作,找高薪工作,你需要掌握这些技能。 高清思维导图下载:https://download.csdn.net/download/weixin_41937552/14752706 目录 HTML5+CSS3 移动Web网页开发

dictionary 用linQ排序

Dictionary<string, int> letterWordTotalNum wordsMrg.GetAllLetterTotalNum();var dicSort from d in letterWordTotalNum orderby d.Key select d;foreach (string key in dicSort.Keys){s Response.Write(dicSort[key] "<br />");}按key进行升…

延迟分析中的案例研究:锁定与同步

特别是在这篇文章中&#xff0c;我们将讨论&#xff1a; java.concurrent.Lock创建的垃圾 比较锁与同步 如何以编程方式测量延迟 争用对锁和同步的影响 协调遗漏对延迟测试的影响 回到我最喜欢的主题之一&#xff0c;垃圾创建/分配。 有关此主题的更多详细信息&#xff0…

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java servlet jsp javabean关系图,一个关于javaBean+servlet+jsp的MVC架构有关问题

当前位置:我的异常网 Java Web开发 一个关于javaBeanservletjsp的MVC架构有关问题一个关于javaBeanservletjsp的MVC架构有关问题www.myexceptions.net 网友分享于&#xff1a;2013-01-14 浏览&#xff1a;13次一个关于javaBeanservletjsp的MVC架构问题//jsp的代码&#xff1…

并发

http://ifeve.com/volatile/转载于:https://www.cnblogs.com/lemon-now/p/5200645.html

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…

matlab ode45 二阶微分,matlab关于ode45解二阶微分方程的困惑

matlab关于ode45解二阶微分方程的困惑matlab关于ode45解二阶微分方程的困惑一个二阶微分方程&#xff1a;yyysin(t)初始条件为y(0)5,y(0)6。过程&#xff1a;先降阶为一阶微分方程组yzz-z-ysin(t)编制如下函数m文件function dyweifen(t,x)dyzeros(2,1);%yx(1)%zx(2)dy(1)x(2);d…

java+jsp+sqlserver 2008+Tomcat实现一个简单的搜索引擎

导读:搜索引擎的定义就是指按照既定的策略与方法,采取相关的计算机程序,通过在互联网中进行寻找信息,并显示信息,最后把找到的信息进行整理和筛选,为搜索引擎的使用者提供检索信息的服务,终极目标是为了提供给使用者,他所搜索信息相关的资料的计算机

精通推荐算法1:为什么需要推荐系统(系列文章,建议收藏)

作者简介&#xff1a; 腾讯算法研究员。硕士毕业于中国科学院大学。在阿里和腾讯工作多年&#xff0c;拥有丰富的搜索和推荐算法经验。CSDN博客专家&#xff0c;原创文章100篇。发表专利15个&#xff0c;其中已授权6个。 系列文章&#xff0c;欢迎关注 精通推荐算法1&#x…

mlse均衡器matlab,基于LMS自适应均衡器matlab仿真.doc

基于LMS自适应均衡器matlab仿真.doc毕 业 设 计(2014届)题 目 一种基于OpenCV的摄像机标定方法学 院 物理电气信息学院专 业 电子信息工程年 级 2010学生学号 1201024534学生姓名 李指导教师2014年5月6日摘要关键词&#xff1a;AbstractIn the field of machine vision and ind…

spring 开发环境_设置Spring 3开发环境

spring 开发环境本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 适用于Jav…

mybaties与hibernate的不同点

hibernate是一个比较完全的ORM框架.而mybaties是一个不完全是一个ORM框架,说mybaties不完全是一个ORM框架是因为sql语句是需要自己写的.但是,mybaties也是有输入映射和输出映射的.因此它也有ORM的思想在,因此说mybaties是一个不完全的ORM框架 而且,mybaties的优胜点在与它的速度…

Java+SSM+Oracle+Navicat+Eclipse+Microsoft Visio实现网上招聘系统

导读:整体基于B/S架构,采用MyBatis框架,运用Java中的Servlet、Jsp等关键技术,并结合Oracle数据库的使用,为招聘者和求职者搭建了一个高效、便利的网络平台。本系统分别为求职者和招聘者提供了信息注册功能,登录功能和信息维护功能。除此之外,求职者可以选择发布、撤销或…

matlab求异面直线的公垂线,求异面直线的公垂线

异面直线间得距离 求异面直线之间得距离就是立体几何重、难点之一。常有利用图形性质,直接找出该公 垂线,然后求解;或者通过空间图形性质,将异面直线距离转化为......求异面直线之间距离的常用策略:求异面直线之间的距离是立体几何重、难点之一。 常有利用图形性质,直接找出该公…

cocoapods 使用时一个问题 (Unable to find a specification for `CYLTableViewPlaceHolder`)

http://blog.csdn.net/zhangao0086/article/details/39703083 这样的问题执行两句代码 :1.pod repo remove master 2.pod setup 这两句代码 把当前Pod的目录清理一下就行了,然后再 pod install 或者 pod update 就可以了转载于:https://www.cnblogs.com/shiguangji728/p/520889…

友盟U-share sdk 分享的接入(支持Android及IOS)

导读:公司的原生开发的APP有块功能原来需要分享小程序到微信,现在改成分享成H5的形式,携带的参数不讨论,这里记录一下。 官方文档:https://developer.umeng.com/docs/128606/detail/129137 安卓分享H5:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4E…

从源文件和JAR文件构建Java代码模型

最近&#xff0c;我花了一些时间来研究有效java &#xff0c;该方法正在GitHub上达到300星&#xff08;随时帮助实现目标&#xff1a;D&#xff09;。 Effectivejava是在您的Java代码上运行查询的工具。 它基于我参与的另一个项目javaparser 。 Javaparser将Java源代码作为输入…