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进制

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

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

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

  2. linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法

    C下通过socket收发十六进制数据 系统是在LINUX下,下位机发送十六进制数据过来 上位机怎么解析 把数据以十六进制的形式显示出来,发送十六进制又如何实现 ------解决方案---------- ...

  3. C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~

    借鉴被人的 C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制.比如20,457: 2. 十六进制,以0x开头.比如0x7a: 3. 八进制,以0开头.比如05,0237 所 ...

  4. 2个字节能存多少个16进制_初探JVM字节码 - 疾风老头

    作者: LemonNan 原文地址: 代码地址: 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 c ...

  5. 16进制数转化为bcd码的方法

    单片机设计中经常进行数制之间的转换,int类型数据可以存放65535以下的数. 转化为bcd码用以下方法: unsigned int hexresult; //待转化的16进制数: unsigned ...

  6. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享

    场景 效果 实现 关键代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  7. android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...

    我通过一些粗略的Stopwatch性能测试运行了各种转换方法,一个带有随机句子的运行(n = 61,1000次迭代)和一个带有Project Gutenburg文本的运行(n = 1,238,957, ...

  8. python把浮点数转换成16进制_Python将colorsys RGB坐标转换为十六进制

    从this answer开始,我在Python中生成一些均匀间隔的颜色,如下所示: >>> import colorsys >>> num_colors = 22 ...

  9. 二进制数据与16进制字符串相互转化方法

    二进制数据转化为16进制字符串(中间加的':'还有':'是为了查看下标,也可以自行去掉): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public st ...

最新文章

  1. Webpack入门教程二十九
  2. word2vec原理(五):skip-gram和CBOW模型代码实现
  3. IIR+全通滤波器级联实现系统零相位相移_matlab仿真
  4. excel公式:定位单元格
  5. pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
  6. attiny13a程序实例_关于ATtiny13A的一段程序
  7. vs添加系统环境变量不识别_项目经验不重样!3个基于SpringBoot 的图片识别处理系统送给你...
  8. JAVA入门到精通(3)IDEA开发工具的使用
  9. 【图论】spfa算法详解
  10. HttpSession介绍
  11. c语言程序设计读书心得,高质量的c语言编程读后感
  12. 主码流和辅码流的区别
  13. 会员卡充值系统小程序开发制作功能介绍
  14. 全球部分免费开放的电子图书馆
  15. 介绍一些新手入门FPGA的优秀网站(新增4)
  16. 揭秘VR游戏开发:与传统3D差距仅10% 低延迟是核心
  17. iOS获取设备的唯一标识的方法
  18. ECMAScript 6 入门(阮一峰)个人总结
  19. 论文写作分析报告CSDN
  20. win10录屏软件哪款比较好用?一款不限时长的录屏软件

热门文章

  1. 输入一个字母,转大小写
  2. 你想象中的实习是什么样的?
  3. 新闻发布项目——接口类(commentDao)
  4. Defination list(定义列表)
  5. java电商面试介绍
  6. 计算机在轻化工程中的应用,计算机在轻化工程专业中的应用-中国大学mooc-题库零氪...
  7. android手机打电话src,【SPILL 百科】SRC:Android 系统的 48kHz 音讯输出限制
  8. 算法运行时间中的对数
  9. MySQL优化(四):count()
  10. spring boot测试_测试Spring Boot有条件的合理方式