tostring 16进制_ToString:身份哈希码的十六进制表示形式
tostring 16进制
我解释说ToStringBuilder将十六进制格式的身份哈希码添加到其输出中。 在本文中,我将更深入地研究ToStringBuilder
对以十六进制格式显示的身份哈希码的使用。 甚至那些不使用ToStringBuilder
也可能会发现此信息很有用,因为Java的标准Object.toString()也使用有效标识其身份哈希码的十六进制表示形式。
我将从使用ToStringBuilder
一个非常简单的Java示例开始。 本示例使用下面显示的三个Java类( Person.java
, Employee.java
和Main.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:身份哈希码的十六进制表示形式相关推荐
- ToString:身份哈希码的十六进制表示形式
我以前在方便的Apache Commons ToStringBuilder上写过博客,最近有人问我,在生成的String输出中出现的看似神秘的文本是什么构成的. 询问该问题的同事正确地推测出他正在查看 ...
- linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法
C下通过socket收发十六进制数据 系统是在LINUX下,下位机发送十六进制数据过来 上位机怎么解析 把数据以十六进制的形式显示出来,发送十六进制又如何实现 ------解决方案---------- ...
- C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~
借鉴被人的 C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制.比如20,457: 2. 十六进制,以0x开头.比如0x7a: 3. 八进制,以0开头.比如05,0237 所 ...
- 2个字节能存多少个16进制_初探JVM字节码 - 疾风老头
作者: LemonNan 原文地址: 代码地址: 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 c ...
- 16进制数转化为bcd码的方法
单片机设计中经常进行数制之间的转换,int类型数据可以存放65535以下的数. 转化为bcd码用以下方法: unsigned int hexresult; //待转化的16进制数: unsigned ...
- Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享
场景 效果 实现 关键代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...
- android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...
我通过一些粗略的Stopwatch性能测试运行了各种转换方法,一个带有随机句子的运行(n = 61,1000次迭代)和一个带有Project Gutenburg文本的运行(n = 1,238,957, ...
- python把浮点数转换成16进制_Python将colorsys RGB坐标转换为十六进制
从this answer开始,我在Python中生成一些均匀间隔的颜色,如下所示: >>> import colorsys >>> num_colors = 22 ...
- 二进制数据与16进制字符串相互转化方法
二进制数据转化为16进制字符串(中间加的':'还有':'是为了查看下标,也可以自行去掉): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public st ...
最新文章
- Webpack入门教程二十九
- word2vec原理(五):skip-gram和CBOW模型代码实现
- IIR+全通滤波器级联实现系统零相位相移_matlab仿真
- excel公式:定位单元格
- pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
- attiny13a程序实例_关于ATtiny13A的一段程序
- vs添加系统环境变量不识别_项目经验不重样!3个基于SpringBoot 的图片识别处理系统送给你...
- JAVA入门到精通(3)IDEA开发工具的使用
- 【图论】spfa算法详解
- HttpSession介绍
- c语言程序设计读书心得,高质量的c语言编程读后感
- 主码流和辅码流的区别
- 会员卡充值系统小程序开发制作功能介绍
- 全球部分免费开放的电子图书馆
- 介绍一些新手入门FPGA的优秀网站(新增4)
- 揭秘VR游戏开发:与传统3D差距仅10% 低延迟是核心
- iOS获取设备的唯一标识的方法
- ECMAScript 6 入门(阮一峰)个人总结
- 论文写作分析报告CSDN
- win10录屏软件哪款比较好用?一款不限时长的录屏软件
热门文章
- 输入一个字母,转大小写
- 你想象中的实习是什么样的?
- 新闻发布项目——接口类(commentDao)
- Defination list(定义列表)
- java电商面试介绍
- 计算机在轻化工程中的应用,计算机在轻化工程专业中的应用-中国大学mooc-题库零氪...
- android手机打电话src,【SPILL 百科】SRC:Android 系统的 48kHz 音讯输出限制
- 算法运行时间中的对数
- MySQL优化(四):count()
- spring boot测试_测试Spring Boot有条件的合理方式