日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tostring 16进制_ToString:身份哈希码的十六进制表示形式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

tostring 16進制

我以前在方便的Apache Commons ToStringBuilder上寫過博客,最近有人問我,在生成的String輸出中出現(xiàn)的看似神秘的文本是什么構成的。 詢問該問題的同事正確地推測出他正在查看的是哈希碼,但與他的實例的哈希碼不匹配。

我解釋說ToStringBuilder將十六進制格式的身份哈希碼添加到其輸出中。 在本文中,我將更深入地研究ToStringBuilder對以十六進制格式顯示的身份哈希碼的使用。 甚至那些不使用ToStringBuilder也可能會發(fā)現(xiàn)此信息很有用,因為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”看起來不像我們中的很多人習慣的整數(shù)哈希碼,因為它們以十六進制表示。 Integer.toHexString(int)方法[自JDK 1.0.2起可用]是一種方便的方法,用于以十六進制格式打印整數(shù),可用于轉換“常規(guī)”哈希碼以查看它們是否與ToStringBuilder生成的哈希碼匹配。 我已經(jīng)在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()));} }

執(zhí)行以上操作會導致以下輸出:

如輸出所示, 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)));}

有了這個,我們現(xiàn)在可以將身份哈希碼與ToStringBuilder生成的字符串進行比較。

最后一個示例明確說明ToStringBuilder在其生成的輸出中包括系統(tǒng)標識哈希碼的十六進制表示形式。 如果要使用覆蓋的哈希碼而不是標識哈希碼的十六進制表示形式,則可以使用ToStringStyle的實例(通常是StandardToStringStyle的實例),并且可以使用false參數(shù)調用方法setUseIdentityHashCode(boolean) 。 此實例ToStringStyle然后可以被傳遞到ToStringBuilder.setDefaultStyle(ToStringStyle)方法。

附帶說明一下,上面顯示的Employee類中的equals(Object)和hashCode()方法是由NetBeans 7.1自動生成的。 我很高興看到,對于該項目,我的Java源代碼版本指定為JDK 1.7 ,這兩種方法的自動生成利用了Objects類。

在本文中,我一直使用ToStringBuilder生成的輸出來促進對身份哈希碼的十六進制表示形式的討論,但是我可以簡單地將JDK自己內(nèi)置的“默認” Object.toString()實現(xiàn)用于同一目的。 實際上,Javadoc甚至宣傳了這一點:

Object類的toString方法返回一個字符串,該字符串包括該對象是其實例的類的名稱,符號字符“ @”以及該對象的哈希碼的無符號十六進制表示形式。 換句話說,此方法返回的字符串等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

我沒有使用此示例開始的唯一原因是,我?guī)缀蹩偸窃陬愔兄貙憈oString()方法 ,并且未獲得此“默認”實現(xiàn)。 但是,當我使用ToStringBuilder實現(xiàn)重寫的toString()方法時,確實看到了這些十六進制表示形式。 隨著增加對Objects.toString()的使用,我可能會減少對ToStringBuilder使用。

我們中的許多人在日常的Java工作中都不會考慮十六進制表示形式或標識哈希碼。 在這篇博客文章中,我以ToStringBuilder的輸出為借口來更仔細地研究這兩個概念。 在此過程中,我還簡要介紹了Integer.toHexString(Object)方法,該方法對于以十六進制表示形式打印數(shù)字很有用。 了解Java對十六進制表示法的支持非常重要,因為Java確實會出現(xiàn)在toString()輸出 , 顏色標簽 , 內(nèi)存地址和其他地方。

參考: ToString: JCG合作伙伴提供 的身份哈希碼的十六進制表示形式 ? 實際事件啟發(fā)博客上的達斯汀·馬克思。


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

tostring 16進制

總結

以上是生活随笔為你收集整理的tostring 16进制_ToString:身份哈希码的十六进制表示形式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。