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.pswp.cn/news/373681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373681.shtml
英文地址,請注明出處:http://en.pswp.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…