コードを見てみましょう。
public class main {public static void main(string [] args){integer num1 = 100;整数num2 = 100;整数num3 = 200;整数num4 = 200; '' '//出力結果' '' system.out.println(num1 == num2); System.out.println(num3 == num4); }}結果は何だと思いますか?
多くの人々は、結果が真実であると考えていますが、結果はこのようではありません。
真実
間違い
なぜこの結果があるのですか?結果がメモリによって説明されている場合、num1とnum2は同じオブジェクトを指し、num3とnum4は異なるオブジェクトを指します。次に、その理由をお話ししましょう。タイプ整数の値の値のソースコードをご覧ください。
public static integer valueof(int i){assert integercache.high> = 127; if(i> = integercache.low && i <= integercache.high)return integercache.cache [i + 128];新しい整数(i)を返します。 }integercacheの実装:
'' '//内部クラスであるintegercacheは、その特性が静的な最終' '' 'private static class integercache {static final int highとして定義されていることに注意してください。 '' '//上限をキャッシュ、一時的にnull' ''静的最終整数キャッシュ[]; '' '//キャッシュ整数配列' '' '' '' '' '' '、なぜブロックとして定義されているのか' '' '' {final int low = -128; '' '//下限、不変のキャッシュ。上限のみが変更できます '' '' '' '' '' //高い値はプロパティで構成できます '' '' '' '' '' '' '' '' ''これは、JDKのAutoBoxCacheMaxパラメーターを設定することで調整できます(以下に説明があります)、自動キャッシュ間隔は[-128、N]に設定されます。間隔の下限が固定されていることに注意してくださいint h = 127。 if(integercachehighpropvalue!= null){'' '//ここでlong.decodeを使用して、' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' // integercachehighpropvalueをデコードすることにより、候補者の上限値をデコードすることにより '' '' long.decode(integercachehhighpropvalue).intvalue(); '' '//大きいものを上限として取りますが、整数max_value' '' i = math.max(i、127)の境界よりも大きくすることはできません。 '' '//最大配列サイズはinteger.max_value' '' 'h = math.min(i、integer.max_value - low); } high = h; '' '//上限が決定されます' '' '' '' '//キャッシュブロックを作成し、キャッシュアレイサイズに注意してください' '' cache = new Integer [(high -low) + 1]; // int j = low; for(int k = 0; k <cache.length; k ++)cache [k] = new Integer(j ++); '' '// -128に高い値に1つずつアレイをキャッシュするように割り当てられます' ''} private integercache(){}}これら2つのコードを通して、Valueofメソッドを介して整数型オブジェクトを作成する場合、値範囲は[-128、127]であることがわかります。この間隔では、ポインターはintegercache.cacheに既に存在するオブジェクト参照を指します。値がこの範囲を超えると、新しいオブジェクトが作成されます。
注意すべきことの1つは、すべてのタイプがこの範囲にあるわけではないということです。二重タイプを見てください。
public class main {public static void main(string [] args){double i1 = 100.0;ダブルI2 = 100.0;ダブルI3 = 200.0;ダブルI4 = 200.0; System.out.println(i1 == i2); System.out.println(i3 == i4); }}最終出力結果:
間違い
間違い
これが結果である特定の理由で、ソースコードのDouble Valueofメソッドの実装を確認できます。特定の範囲の整数値の数は制限されているが、浮動小数点数はそうではないため、整数値のメソッドとは異なります。
整数、短い、バイト、文字、および長い方法の価値の実装は類似していることに注意してください。
DoubleとFloatのValueof Methodの実装は似ています。
1つを引き下げると、ブールタイプの結果には2つのTrueまたはfalseがあります。ソースコードを直接ご覧ください。
public static boolean valueof(boolean b){return(b?true:false); }真と偽は次のように定義されます。
public static final boolean true = new boolean(true); '' '/**' '' '' '' **プリミティブに対応する<code> boolean </code>オブジェクトは<code> false> false>。 '' '' '' '' **/'' '' '' '' '' '*public static final boolean false = new boolean(false);
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。