查看规范页面,我看到%h
调用Integer.toHexString(),但我找不到两个说明符之间的任何实际区别。
你能举一个例子,在相同的输入上使用 to 说明符会产生不同的结果吗?
System.out.println(String.format("%1$h %1$x", 123));
这打印
7b 7b
查看规范页面,我看到%h
调用Integer.toHexString(),但我找不到两个说明符之间的任何实际区别。
你能举一个例子,在相同的输入上使用 to 说明符会产生不同的结果吗?
System.out.println(String.format("%1$h %1$x", 123));
这打印
7b 7b
说明符在其参数上%h
调用hashCode
(假设它不是null
,当您获得“null”时),而说明%x
符只是将其参数格式化为十六进制整数。如果被格式化的东西不是整数,这会产生很大的不同。请参阅此处的示例:
http://developer.android.com/reference/java/util/Formatter.html
特别是,对于整数,您得到相同结果的事实是Integer.hashCode
返回整数本身的结果:
http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#hashCode%28%29
您提供的页面指出:
'h' 如果参数 arg 为 null,则结果为“null”。否则,通过调用 Integer.toHexString(arg.hashCode()) 获得结果。
和
'x' 结果被格式化为十六进制整数
所以%h
打印null
提供的对象是否为null
,否则%h
打印对象的哈希码。而%x
打印提供值的十六进制 int
值。
编辑:正如评论中所指出的:如果没有%x
给出值,IllegalFormatConversionException
则抛出一个,如此处所述:
如果格式说明符包含不适用于相应参数的转换字符,则会抛出 IllegalFormatConversionException。
所以基本上,你只需要阅读你提供的页面...... :)
%h
以十六进制打印对象的哈希码。
%x
以十六进制打印一个数字。
因为Integer
hashCode 和 value 是一样的。对于Long
value 和 hashCode 可以不同。
System.out.printf("%h%n", "hello world");
System.out.printf("%h%n", 0x1234567890L);
System.out.printf("%x%n", 0x1234567890L);
印刷
6aefe2c4
34567882
1234567890