【问题标题】:Java: What's the difference between format specifiers %x and %h?Java:格式说明符 %x 和 %h 有什么区别?
【发布时间】:2013-01-03 16:31:18
【问题描述】:

查看specification page,我看到%h 调用了Integer.toHexString(),但我找不到这两个说明符之间的任何实际区别。

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

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

这会打印出来

7b 7b

【问题讨论】:

  • 尝试将null 传递给格式化程序。
  • 不,它调用Integer.toHexString(arg.hashCode()) 这是一个非常不同的东西。
  • 描述完全不同; %h 在 arg 的 hashCode 上调用 toHexString。
  • 好吧,一个只接受整数类型,另一个接受任何(合理的)类型。

标签: java format


【解决方案1】:

%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

【讨论】:

    【解决方案2】:

    page you provided 声明:

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

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

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

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

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

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

    【讨论】:

    • %x 不传递整数时会做什么?
    • 它会抛出IllegalFormatConversionException
    【解决方案3】:

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

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

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

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

    打印

    6aefe2c4
    34567882
    1234567890
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 2014-03-13
      • 2013-10-21
      • 2012-06-22
      • 2018-04-28
      • 2011-01-15
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多