Java:格式说明符%x和%h有什么区别?

6
看到规范页面,我发现%h调用Integer.toHexString(),但我找不到两个说明符之间的任何实际区别。
您能否举一个例子,在相同的输入上使用两个说明符会产生不同的结果?
System.out.println(String.format("%1$h %1$x", 123));

这将打印

7b 7b

3
尝试将“null”传递给格式化程序。 - John Dvorak
1
不是的,它调用的是 Integer.toHexString(arg.hashCode()),这是一件非常不同的事情。 - Brian Roach
1
描述非常不同;%h 在参数的哈希码上调用 toHexString。 - Oliver Charlesworth
一个只接受整数类型,而另一个则接受任何(合理的)类型。 - jn1kk
3个回答

15

%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


7

您提供的页面中写道:

'h' 如果参数arg为null,则结果为"null"。否则,通过调用Integer.toHexString(arg.hashCode())获得结果。

'x' 结果以十六进制整数格式化。

因此,%h会在提供的对象为null时打印null,否则%h会打印对象的哈希码。而%x则打印提供的int值的十六进制值。

编辑:如评论所指出的:如果没有给%x提供值,将会抛出IllegalFormatConversionException,如下所述:

如果格式说明符包含不适用于相应参数的转换字符,则将抛出IllegalFormatConversionException。

所以基本上,您只需要阅读您提供的页面... :)


当没有传递一个整数时,"%x"是做什么用的? - John Dvorak
1
它会抛出“IllegalFormatConversionException”异常。 - BalusC

5

%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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接