2013-01-03 9 views
5

specification pageを見ると、%hInteger.toHexString()にコールされていますが、2つの指定子の間には実用的な違いはありません。Java:フォーマット指定子%xと%hの違いは何ですか?

同じ入力のto指定子を使用すると結果が異なる場合がありますか?

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

これは%x指定子はちょうど16進数の引数をフォーマットするのに対し、%h指定子は、(あなたが「ヌル」を取得するとき、それは、nullではありません提供された)その引数にhashCodeを呼び出し

7b 7b 
+3

は、フォーマッタに 'null'なのでを渡して試してみてください。 –

+1

いいえ、Integer.toHexString(arg.hashCode())を呼び出します。これは、まったく別のものです。 –

+1

説明はかなり異なっています。 '%h'は、argのhashCodeでtoHexStringを呼び出します。 –

答えて

6

:特に

http://developer.android.com/reference/java/util/Formatter.html

を、あなたは整数の同じ結果を得るという事実はInteger.hashCodeが整数自体を返すという事実の結果でありますpage you provided状態:

'h'引数argがnullの場合、結果は「null」です。 "それ以外の場合は、Integer.toHexString(arg.hashCode())を呼び出して結果を取得します。

「X」結果は、16進整数として書式設定され

だから%hプリントnull提供されるオブジェクトは、他null、オブジェクトの%hプリントハッシュコードであった場合。 %xは、指定されたint値の16進値を出力します。

編集は:コメントで指摘したように:%xのための値を指定しない場合は、ここで述べたようにIllegalFormatConversionExceptionが、スローされます。

書式指定子がには適用されません変換文字が含まれている場合対応する引数の場合、IllegalFormatConversionExceptionがスローされます。

だから、基本的に、あなたはちょうどあなたが提供するページを読み取るために必要だろう... :)

+0

整数を渡さないと '%x'は何をしますか? –

+1

'IllegalFormatConversionException'がスローされます。 – BalusC

+0

@BalusCテストの価値 –

5

%hは16進数でオブジェクトのハッシュコードを出力します。

%xは、16進数で数値を出力します。

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