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

时间:2013-01-03 16:31:18

标签: java format

查看specification page,我看到%h调用Integer.toHexString(),但我发现两个说明符之间没有任何实际差异。

您能举例说明在同一输入上使用to说明符会产生不同的结果吗?

System.out.println(String.format("%1$h %1$x", 123));

打印

7b 7b

3 个答案:

答案 0 :(得分:13)

%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

答案 1 :(得分:7)

page you provided州:

  

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

  

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

如果提供的对象为%h,则null打印null,否则%h打印对象的哈希码。而%x打印提供的int值的十六进制值。

修改:正如评论中所指出:如果没有给出%x的值,则会抛出IllegalFormatConversionException,如下所述:

  

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

基本上,你只需阅读你提供的页面......:)

答案 2 :(得分:5)

%h以十六进制格式打印对象的哈希码。

%x以十六进制打印一个数字。

对于Integer,hashCode和值是相同的。对于Long,值和hashCode可以不同。

System.out.printf("%h%n", "hello world");
System.out.printf("%h%n", 0x1234567890L);
System.out.printf("%x%n", 0x1234567890L);

打印

6aefe2c4
34567882
1234567890