IntからIntegerオブジェクトであり、さらに多くのものを持って製品を作ります

Javaは、整数int型は、データを格納するint型の変数を使用して、包装、整数間の共通操作の数である、オブジェクトされていない、8つのプリミティブint型の一つであるいくつかの事Java言語の一つであります通常のプレゼンテーションでは、プログラマがソースプログラマーのように、我々はそれのソースを見て、言って好きではないように、

 * @author  Lee Boynton
 * @author  Arthur van Hoff
 * @author  Josh Bloch
 * @author  Joseph D. Darcy
 * @since JDK1.0
 */
public final class Integer extends Number implements Comparable<Integer> {
    /**
     * A constant holding the minimum value an {@code int} can
     * have, -2<sup>31</sup>.
     */
    @Native public static final int   MIN_VALUE = 0x80000000;

    /**
     * A constant holding the maximum value an {@code int} can
     * have, 2<sup>31</sup>-1.
     */
    @Native public static final int   MAX_VALUE = 0x7fffffff;


    /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;

    /**
     * Constructs a newly allocated {@code Integer} object that
     * represents the specified {@code int} value.
     *
     * @param   value   the value to be represented by the
     *                  {@code Integer} object.
     */
    public Integer(int value) {
        this.value = value;
    }

    /**
     * Constructs a newly allocated {@code Integer} object that
     * represents the {@code int} value indicated by the
     * {@code String} parameter. The string is converted to an
     * {@code int} value in exactly the manner used by the
     * {@code parseInt} method for radix 10.
     *
     * @param      s   the {@code String} to be converted to an
     *                 {@code Integer}.
     * @exception  NumberFormatException  if the {@code String} does not
     *               contain a parsable integer.
     * @see        java.lang.Integer#parseInt(java.lang.String, int)
     */
    public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }

このソースは、Integerクラスで私を傍受された上で、これらのコードは、それらを一緒に入れて、一緒にリンクされていない、それは、Integerクラスは、私は何かを説明したいので、我々は慎重にこのコードを見ています最終的に、これは何を示していますか?変数を格納するために使用される値はまた、今度は何を説明している、最終的に民間に変更できますか?これらは、それに慣れて少し見ていないですか?はい、Integerオブジェクトを示しあまりにStringオブジェクトは、不変であるので、将来的に求められたIntegerオブジェクトは不変でない場合、答えはああであることを覚えています。なぜIntegerオブジェクトは、不変オブジェクトになるように設計されていますか?実際に、私は、ドキュメントから答えを見つけられませんでしたが、Yangxiaofengの先生で、物品の説明については、見ている、知らない、教師はYangxiaofeng Integerクラスは不変はgetInteger()メソッドとの関係を持つように設計された、ソースはgetInteger()メソッド次のように:

public static Integer getInteger(String nm, Integer val) {
    String v = null;
    try {
        v = System.getProperty(nm);
    } catch (IllegalArgumentException | NullPointerException e) {
    }
    if (v != null) {
        try {
            return Integer.decode(v);
        } catch (NumberFormatException e) {
        }
    }
    return val;
}

getInteger()メソッドは、システムプロパティを取得するために使用され、我々は、整数の変数は、その後、我々は簡単に私たちの製品が存在します。このプロパティの値を、変更することができれば、プロパティを介してサーバポートサーバーを設定する必要がありますセキュリティリスク。

私たちは、単に自然に、最終的には、オートボクシングと自動アンボクシング、int型と整数に話し、上記Integerクラスのおしゃべりは何実現しました。

1、自動包装、開梱

自動ボクシングとアンボクシングはJDK 1.5の機能の導入当初からある、それはシンタックスシュガーであり、Javaが自動的にコンテキストに応じてプリミティブ型およびパッケージの種類を変換することができ、単にJavaプラットフォームが異なることを保証することを意味書き込みがコンパイルした後、同じバイトコードを生成し、実行時の保証は等価です。自動ボクシングとアンボクシングを大幅に関連するプログラミングを簡素化します。

オートボクシング:プロセスタイプの元のパッケージ・タイプを変換します

例えば、包装タイプへの変更の元の型はコンパイル時に、あるタイプを、整数にint型に変換するために、コンパイラが自動的に変換を行うために私たちを助ける、私たちのプログラマのプロセスは、このような、気づいていませんコードに割り当てられた整数オブジェクト:

Integer x = 3000;

コンパイラの後にこのコードは、次のコードに変換されます。

Integer x = Integer.valueOf(3000);

valueOf()メソッドへの自動プロセスでのボクシングは、この方法では、ソースJDKを見て、これはあなたが知らない自動包装工程であるので、オートボクシングと呼ばれています:

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

この方法は、あなたがそれを知らない場合には、裁判官のキャッシュの前で行わ最初は最初にそれを無視し、最後に新しい整数(I)オブジェクト参照に戻って、これはコンストラクタIntegerクラスを呼び出すためにあなたを支援することです。これは、自動包装です。

自動アンボクシング:プロセスの元の型にパッケージタイプを変換します

int型の整数は、プロセスの元型にパッケージ型に変換されるタイプを、変換するために、プロセスが開梱自動的に関与します。このコードを見てみましょう(非常にコードを台無しにされ、実際には誰も書くべきではありません):

Integer mm = 1000;
int mmm = mm;

コンパイル時に、コンパイラのコードは、次のコードにコンパイルされています。

Integer mm = Integer.valueOf(1000);
int mmm = mm.intValue();

主に見るためにint mmm = mm.intValue();、私たちが書いたコード行で、このコード行をソースIntegerクラスintValue()メソッドを見てintValue()メソッドを使用するには、同じではありません。

/**
 * Returns the value of this {@code Integer} as an
 * {@code int}.
 */
public int intValue() {
    return value;
}

このメソッドの役割は、Integerオブジェクトは、これは自動的にも、自動ボクシングと自動アンボクシング我々はすべて知っている上で、プロセスに関与オートボクシングを覚えて、開梱され、戻り値の変数の値を格納するために使用されるということですそれをキャッシュ?次に私たちは一緒に見えます。

2、整数のキャッシュポリシー

valueOf()メソッドをオートボクシングでは、我々は、キャッシュ決意動作は、Integerクラスは、バッファプールを有し、システム性能を向上させるために、頻繁にオートローダーをキャッシュされた値を使用することである見ています存在しない場合は、バッファプール参照リターンから直接そこに取り込まれた場合、プロセスタンク内に、最初のそれは、値がプールにキャッシュされているか否かを判断し、オブジェクトのコンストラクタ関数が呼び出されます。キャッシュ専用自動包装操作、バッファの範囲内の値は、バッファプールが使用されていない場合でも、Integerオブジェクトから直接構成コンストラクタです。次のようにIntegerクラスでは、クラスは、内部キャッシュ、IntegerCacheと呼ばれるこの内部クラスを実装するために、IntegerCacheクラスのソースコードは次のとおりです。

    /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */

    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");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } 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++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

ソースからのJavaアノテーションと、私たちは、-128〜127 IntegerCacheのデフォルトのバッファ範囲を見ることができます。しかし、我々はまた、単に起動時に-XXを追加し、起動時にJVMコマンドによるキャッシュの最大範囲を設定することができます。AutoBoxCacheMax =
パラメータがあることが、あなたは、あなたがそれを取るだろうと思いますが、メモリを追加するために起動したときに、数10万がちょうど開始します、あなたが100,000に設定され、たとえば、完全な範囲を考慮する必要があり、このサイズを設定することができ乱用しないように覚えていますどのくらいのメモリ?良いよりも害をやって、Javaの会社は127に-128に設定されている理にかなって、ほとんどの人は使用価値を見出す-128から127の間であり、これらの値は、パフォーマンス上に構築機能構造により、より少ないメモリを占有オブジェクトがはるかに優れています。私は=新しい整数(値)を形成する整数を使用しているどのようにあなたはキャッシュの範囲内にない価値場合は、フォームの整数I =値でオブジェクトを構築するために、バッファの範囲の整数を使用しない値自動避けるためにIntegerオブジェクトを構築梱包プロセス。最後に、我々はIntegerオブジェクトより一般的に使用されるメソッドのparseIntメソッドを見て

3、のparseInt()メソッド

ロールのparseInt()メソッドは整数に整数文字列を変換するために使用され、parseIntはとvalueOfメソッドを区別するための方法を必要とし、すべての、多くの人がこれらの2つの方法、返品の最後のint型の違いは何であるか尋ねますがありますそのようなコードのように、一体型の整数値の列に変換

System.out.println(Integer.parseInt("+12"));
System.out.println(Integer.valueOf("+12"));

出力方法は、のvalueOfが整数整数型文字を変換するためのparseIntメソッドを使用して呼び出し、12はメモリであるIntegerオブジェクトを作成するように、結果は同じであるため、最終的に、出力は、12になり、その後、オブジェクトの参照を返します。parseIntメソッドは、追加のオブジェクトを作成していない、あなたは整数整数に文字を入力するのに役立ちます。彼らは同じ結果を得るので、2つは純粋に偶然です。シュシュ一緒のparseIntソース:

public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */

        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }

parseIntメソッドを呼び出すとき、我々は変数基数を渡すことができ、バイナリ変換するために、どのようにそれを伝えるために使用され、小数がデフォルトで使用されています。

記事の不備は、ポインティングの多くは、一緒に学ぶことを願って、共通の進捗状況

遂に

一緒に進歩「技術的ボーエンのフラットヘッドの兄」:少し宣伝を再生する、マイクロチャンネルスキャンコード番号の公衆に焦点を歓迎しました。
技術的ボーエンのマイナス弟

おすすめ

転載: www.cnblogs.com/jamaler/p/11605945.html