0

オブジェクトはJavaではかなり理解しやすいです。オブジェクトが作成され、ヒープ内にスペースが割り当てられ、それを指す変数名(参照)にオブジェクトが割り当てられます。大きな問題ではない。しかし、プリミティブ型はどのように表されますか?そして、それらはどこにありますか(スタックまたはヒープ)?

Integer.toString(int)この方法がどのように見えるのか疑問に思ったときに、この質問を思いつきました。テキストではないため、テキストを解析できません。メソッドを明示的または暗黙的に呼び出すことはできません。これはtoString()、プリミティブ型にメソッドを割り当てることができないという事実を循環論理と無視の両方であるためです(オブジェクトではないため)。メソッドがとの間のすべての可能な値if/elseに対して大量の条件を設定することは論理的に可能であると思いますが、それは本来よりもはるかに複雑に思えます。intInteger.MIN_VALUEInteger.MAX_VALUE

では、これはどのように機能しますか?

4

3 に答える 3

5

しかし、プリミティブ型はどのように表されますか?

プリミティブ型のインスタンスは、メモリ内のビットパターンとして表されます。したがって、たとえば、anintは32ビット(4バイト、1つの32ビットワード)として表されます。

そして、それらはどこにありますか(スタックまたはヒープ)?

また。プリミティブ値を保持する変数の種類によって異なります。

Integer.toString(int)メソッドはどのように見えるのだろうかと思っていました。

メソッドのコアは単純なアルゴリズムであり、繰り返し繰り返されるループです。

  1. 余り10をとって、最後の10進数を取ります。
  2. 数値を10で割ります。

2進数を10進数に手動で変換する場合と同じように。

(詳細については、ソースコードを参照してください。すべてのSun / Oracle JDKには、コアライブラリのソースコードが含まれています。または、インターネットでGoogle検索を使用してソースコード(さまざまなバージョン)を簡単に見つけることができます。)

于 2012-09-22T03:45:44.973 に答える
1

どのようInteger.toString(int)に見えるかを考える必要はありません(リンクはJava 6のOpenJDK実装を示しています)。これは、getChars10進数の各桁を単純に分割するパッケージプライベートヘルパー関数を使用します。

コードの要点は次のとおりです:(これは354行目から始まります)

     // Generate two digits per iteration
     while (i >= 65536) {
         q = i / 100;
         // really: r = i - (q * 100);
         r = i - ((q << 6) + (q << 5) + (q << 2));
         i = q;
         buf [--charPos] = DigitOnes[r];
         buf [--charPos] = DigitTens[r];

     }
于 2012-09-22T03:45:34.827 に答える
1

メソッドは、Javaバイトコードを使用して実装されます。このリファレンスを見て、バイトコードを使用して簡単なメソッドを実装する方法を確認してください。通常、インタプリタまたはジャストインタイムコンパイラ(JIT)のいずれかがこれらのバイトコードを実行します。

基本的に、オブジェクト参照またはプリミティブ型のいずれかを含むことができるスタックがあります。バイトコードを使用すると、スタック上のアイテムに対して操作を実行できます(2つ追加するか、1つでメソッドを呼び出すなど)。

于 2012-09-22T03:46:32.057 に答える