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

Cri*_*scu 6 java format

看一下规范页面,我看到%h调用Integer.toHexString(),但是我找不到两个说明符之间的任何实际区别.

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

System.out.println(String.format("%1$h %1$x", 123));
Run Code Online (Sandbox Code Playgroud)

这打印

7b 7b
Run Code Online (Sandbox Code Playgroud)

Stu*_*etz 13

%h说明符调用hashCode它的参数(只要它不是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


Veg*_*ger 7

您提供页面说明:

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

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

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

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

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

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


Pet*_*rey 5

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

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

对于IntegerhashCode和值是相同的.对于Long值和hashCode可以是不同的.

System.out.printf("%h%n", "hello world");
System.out.printf("%h%n", 0x1234567890L);
System.out.printf("%x%n", 0x1234567890L);
Run Code Online (Sandbox Code Playgroud)

版画

6aefe2c4
34567882
1234567890
Run Code Online (Sandbox Code Playgroud)