1

オブジェクトを作成するときに使用される変数がJavaで持続するかどうかを少し調べようとしています。

具体的には、BigInteger を見ています。コードを正しく読んでいると、ビットごとに加算などを行う代わりに、数値が32ビットワードに分割され、より高速な操作が可能になります。私が把握できていないのは、この 32 ビットのワード表現と他の変数 (mag[]、signum など) を、メソッドが BigInteger で使用されるたびに作成する必要があるのか​​、それとも何らかの方法でキャッシュに保持され、関連付けられたままになるのかということです。作成された特定の BigInteger で。

4

2 に答える 2

2

これらは単なる通常のオブジェクト フィールドです。オブジェクトの格納方法です。それらは「メソッドが BigInteger で使用されるたびに作成される」わけではありません。何から作成されるのでしょうか? ABigInteger そのフィールドのセットとして実装されます。それらが推定される他の魔法の実装はありません。

于 2013-08-09T20:20:23.087 に答える
2

このコードを見ていると思います:

 1054    public BigInteger add(BigInteger val) {
 1055         int[] resultMag;
 1056         if (val.signum == 0)
 1057             return this;
 1058         if (signum == 0)
 1059             return val;
 1060         if (val.signum == signum)
 1061             return new BigInteger(add(mag, val.mag), signum);
 1062 
 1063         int cmp = intArrayCmp(mag, val.mag);
 1064         if (cmp==0)
 1065             return ZERO;
 1066         resultMag = (cmp>0 ? subtract(mag, val.mag)
 1067                            : subtract(val.mag, mag));
 1068         resultMag = trustedStripLeadingZeroInts(resultMag);
 1069 
 1070         return new BigInteger(resultMag, cmp*signum);
 1071     }

参照するmagおよびは、の各インスタンスのフィールドです。これらはオンデマンドで計算されるのではなく、 の実装の一部です。彼らのアクセス方法 (関数呼び出しではない) は、単にストレージの場所にアクセスしていることを示しています。signumBigIntegerBigInteger

于 2013-08-09T20:24:40.497 に答える