ホームページ  >  記事  >  Java  >  Integer.valueOf、 Integer.parseInt 、 new Integer

Integer.valueOf、 Integer.parseInt 、 new Integer

巴扎黑
巴扎黑オリジナル
2017-06-26 10:41:091572ブラウズ

まずは以下の結果を見てください

1.System.out.println(127==127); //true , int type compare2.System.out.println(128==128); //true , int type compare3.System.out.println(new Integer(127) == new Integer(127)); //false, object compare4.System.out.println(Integer.parseInt("128")==Integer.parseInt("128")); //true, int type compare5.System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); //true ,object compare, because IntegerCache return a same object6.System.out.println(Integer.valueOf("128")==Integer.valueOf("128")); //false ,object compare, because number beyond the IntegerCache7.System.out.println(Integer.parseInt("128")==Integer.valueOf("128")); //true , int type compare

説明

int整数定数を比較する場合、==は値の比較であるため、1,2はtrueを返します。 1、2は値の比較です。

new Integer() は毎回新しい Integer オブジェクトを構築するため、3 は false を返します。 3 はオブジェクトの比較です。

Integer.parseInt は毎回 int 定数を構築するため、4 は true を返します。 4は値の比較です。

Integer.valueOf は Integer オブジェクトを返します。デフォルトでは、-128 ~ 127 の場合、キャッシュ内の既存のオブジェクト (存在する場合) が返されるため、5 は true を返し、6 は false を返します。図 5 と 6 はオブジェクトの比較です。

7 番目のものは特別で、int と Integer の比較であり、結果は値の比較であり、true を返します。

概要

整数の比較では、まず値の比較であるかオブジェクトの比較であるかを判断します。値の比較は、いずれかが値である場合は必ず true を返します。オブジェクトの比較は、新しい Integer メソッドが使用される場合、毎回新しいオブジェクトが生成されます。Integer.valueOf メソッドの場合は、必ず false が返されます。値の範囲が -128 ~ 127 である場合、同じ値を持つ構築されたオブジェクトは比較後に true を返し、それ以外の場合は false を返します。

したがって、値の比較 == については心配しないでください。もちろん、整数の比較では、オブジェクトの内容を比較するために、最初に整数が null でないかどうかを確認するのが最善です。

知識の拡張

Integer.valueOf ソース コードを分析します

1。呼び出した Integer.valueOf メソッドは、最初に parseInt を呼び出して int 値に変換し、次に独自のオーバーロードされたメソッドを調整します

public static Integer valueOf(String s) throws NumberFormatException {return Integer.valueOf(parseInt(s, 10));
    }

2. Integer.valueOf オーバーロードされたメソッドは、値 i のサイズに基づいて Integer オブジェクトをキャッシュから取得するかどうかを決定します

 public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
    }

3. Integer のコンストラクターは非常に単純です

  public Integer(int value) {this.value = value;
    }

4。静的クラスは Integer 内部クラス、3 つの属性 (キャッシュされた Integer 配列 + キャッシュ範囲のセット) です

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by property(最大值可配置)int h = 127;
            String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); //读取VM参数if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue); //配置值转换成int数值i = Math.max(i, 127);  //和127比较,取较大者// Maximum array size is Integer.MAX_VALUE(控制缓存数组的大小,最大为整型的最大值,这样一来,h值就必须小于整型最大值,因为要存 -128~0这129个数嘛)h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //实际就是 h=Math.min(i,Integer.MAX_VALUE-129),正整数能缓存的个数} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.                }
            }
            high = h;

            cache = new Integer[(high - low) + 1]; //构造缓存数组int j = low;for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);  //将一些int常量缓存进Integer对象数组缓存中去// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127; //如果小于127,抛异常}private IntegerCache() {}
    }

上記の Integer.valueOf ソース コードを読むと、デフォルトの Integer キャッシュ int 定数プールを設定できることがわかりますはい、構成方法は VM パラメーターを追加することです。 -Djava.lang.Integer.IntegerCache.high=200

Intellij IDEA 実行構成の VM オプション オプションにパラメーターを追加するだけです。

以上がInteger.valueOf、 Integer.parseInt 、 new Integerの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。