インタビュアー:兄弟との違いは、それをパッケージの基本的な種類やタイプについての話します

六年前、私は、「帰国」の精神を保持し、洛陽、蘇州から返された履歴書の多くをキャストするだけでなく、面接の多くを「インタビュー」が、唯一の二十から三私は満足しています。そのうちの一つは、馬と呼ばれ、今でも私の携帯電話のアドレス帳に住んでいます。基本タイプと、それをパッケージの種類の違いについて教えてください:彼はその後、無知、私の顔の質問を壊して投げました。

私は、Javaプログラミングにおける長年の経験に従事し二十から三、陽性の若者は、(Nは<4)、すべてのインタビューの質問を考える堪能することができNを持っている、結果はああは思わなかったし、「困難」だった - 元洛陽インターネットこの砂漠の技術的な専門家があああります。振り返ってみると、彼の顔は、無意識のうちに恥赤面をスロー:主に自身があまりにも料理でした。とにかく、それは基本的なタイプの違いについての記事を書いて、パッケージの種類を分析する時間です。

Javaの各基本タイプな包装int型整数、二重包装タイプダブルとして、パッケージの種類に対応しています。パッケージの基本タイプとタイプの違いは、以下の4点です。

01、パッケージの種類はnullにすることができますが、基本的なタイプではありません

それはPOJOパッケージタイプに適用することができるように、この違いを過小評価しない、との基本的なタイプではないでください。

POJOそれは何ですか?ここで少し説明。

POJO英語スタンドPlain Ordinary Java Objectのみ属性フィールドおよびgetterメソッドとsetterメソッド、Javaオブジェクトの単純なルールではありません何を翻訳し、次のように、例があります。

class Writer {
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

POJOと同様の、並びにデータ転送は、DTO(データ転送オブジェクト、サービス層およびプレゼンテーション層との間のデータ伝送のためにオブジェクトを参照)、ビュー・オブジェクトVO(ビュー・オブジェクト、カプセル化されたデータのページ)、オブジェクト永続オブジェクトPO(永続的オブジェクトは、Javaオブジェクトは、データベースのテーブルマッピングに見ることができます)。

なぜPOJOのプロパティは、それをパッケージの種類を使用する必要がありますか?

「マニュアルアリババJavaの開発」に関する詳細な手順は、我々は(準備、開始)についての読み上げがあります。

あなたは、それがスローされます(int型の値に変換するには、そのようなIntegerオブジェクトとしての基本的なタイプ、へのパッケージングの種類)による自動ボックス化解除に、単語の基本的な型を使用する場合は、データベースの結果が、nullの場合もNullPointerException例外を。

02、パッケージには、ジェネリック型、基本型ではなくのために使用することができます

基本タイプを使用している場合、それはエラーをコンパイルしますので、ジェネリック医薬品は、基本的な型を使用することはできません。

List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
List<Integer> list = new ArrayList<>();

なぜ?コンパイル時の型のジェネリックが消去されますので、最終的には唯一の元の型、そして唯一のプリミティブ型のObjectクラスとそのサブクラスを残して - 基本的なタイプは特殊なケースです。

03は、基本的なタイプは、包装の種類よりも効率的です

実質的に直接スタック型の特定の値に格納され、格納されているパッケージの種類は、ヒープへの参照です。

 

 

明らかに、タイプの基本的な用語に比べて、パッケージの種類は、より多くのメモリ空間を占有する必要があります。言葉のない基本的な種類が存在しない場合は、多くの場合、数値データのこのタイプのために使用され、パッケージの新しいタイプ別に各時間は非常に面倒です。

03、二つの値は、パッケージの同じタイプであるが、等しくないかもしれ

-包まれた二つは同じであってもよいが、それらは等しくない - それを理解するにはどのようにこの文?明確にコードのセクションを見てください。

Integer chenmo = new Integer(10);
Integer wanger = new Integer(10);

System.out.println(chenmo == wanger); // false
System.out.println(chenmo.equals(wanger )); // true

「==」を用いた二パッケージタイプが判定された場合、アドレスがそれ点が同じであると判断されます。chenmoと新しいキーワードを使用してwanger二つの変数は、時に「==」偽で出力にそれらの原因となります。

そしてchenmo.equals(wanger)内部INT 2つの値を比較するequalsメソッドが等しいため、出力結果は、真です。ソースは以下のとおりです。

private final int value;

public int intValue() {
    return value;
}
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

値chenmoとwangerは10ですが、彼らは同じではありませんが、見て。言い換えれば、「==」演算子は、パッケージタイプを比較するために適用され、結果が予想される可能性が高いと一致していません

04、自動アンボクシングオートボクシング

今、あなたは基本タイプとパッケージタイプを持っていることを、確かにあなたがそれらの間で切り替えたいがございます。プロセスの基本型に変換は梱包タイプのパッケージ(ボクシング)と呼ばれています。逆に、変換するパッケージ型プロセスの基本的なタイプは、(アンボクシング)をアンパックと呼ばれています。

JavaのSE5前に、開発者は、商品との手動べき、例えば:

Integer chenmo = new Integer(10);  // 手动装箱
int wanger = chenmo.intValue();  // 手动拆箱

JavaのSE5開発者の作業を軽減するためには、自動包装および自動機能の開梱を提供します。

Integer chenmo  = 10;  // 自动装箱
int wanger = chenmo;     // 自动拆箱

上記のコードは次のようにJAD結果を逆コンパイル使用します。

Integer chenmo = Integer.valueOf(10);
int wanger = chenmo.intValue();

これは、自動包装することにより、Integer.valueOf()行われ、アンボクシングが自動的経由でInteger.intValue()行わ。あなたは原理を理解すれば、のは、私を与えるその後、馬の顔の質問を見てみましょう。

// 1)基本类型和包装类型
int a = 100;
Integer b = 100;
System.out.println(a == b);

// 2)两个包装类型
Integer c = 100;
Integer d = 100;
System.out.println(c == d);

// 3)
c = 200;
d = 200;
System.out.println(c == d);

答えは何ですか?あなたはそれに答えるために手を上げてきましたか?正解はああ小さな赤い花を報います。

まず、コード、および基本的なタイプの包装の種類==比較は、この時間は自動的にB、および直接比較値を開梱され、結果はtrueです。

コードの2番目の段落は、2つのパッケージタイプが100に割り当てられ、この時間は、オートボクシングになり、何が==の結果がそれであるだろうか?

我々の以前の結論は以下のとおりです。パッケージの種類を比較するときに「==」演算子が使用され、その結果は互換性がないと予想される可能性があります。その結果は、偽のですか?しかし、結果は真である今回は、非常に予想外の感じではないですか?

コードの3段落は、2再パッケージタイプが200に割り当てられ、この時間はまだオートボクシングになり、何が==の結果がそれであるだろうか?

不利でコードの2番目の段落の後、それは少し懐疑的な人生ではなく、この結果は真か偽?ハハ、コインを投げます。私は、偽のあなたにそれの結果を教えてみましょう。

なぜ?なぜ?なぜ?

それのソースコード解析 - このポイントに物事は、キラーに頼ってきました。

我々はすでに知っている前に、自動包装を通じてInteger.valueOf()行われ、その後、我々はこのアプローチそれのソースを見てみましょう。

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

困っているIntegerCacheを意味していますか?あなたはそれを推測しました!

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;
        int i = parseInt(integerCacheHighPropValue);
        i = Math.max(i, 127);
        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        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;
    }
}

大雑把にあなたはすべてを理解しましょう。このコードを一瞥を投げかけます。-128と127の間の数が比較IntegerCacheから採取したので、コードの第2のセグメント(100でこの範囲内の)結果が真であり、コードの第3のセグメント(200は、この範囲内で新しいものではないであろう2つのIntegerオブジェクトアウト)結果はfalseです。

上記の分析を読んだ後、私はあなたがこれを覚えて願っています:自動包装の必要性は、-128〜127の間の数字ならば、直接ではなく、オブジェクトを再作成するよりも、キャッシュ内のオブジェクトを使用するとき

自動的に商品を当社の開発者の労力を節約、便利な機能ですが、それはパフォーマンスが悪い、など次のコードのような問題を引き起こす可能性があります。

long t1 = System.currentTimeMillis();
Long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE;i++) {
    sum += i;
}
long t2 = System.currentTimeMillis();        
System.out.println(t2-t1);

合計が宣言されますので、パッケージの種類は、長い長い基本タイプ、そうではありませんsum += i、このコードを実行すると取るを完成するに至っ入力ボックスの操作(合計が第1の和を開梱し、私、その後、梱包を合計するために割り当てられた)の多くは、 2986ミリ秒の時間いっぱい;長基本タイプ、唯一の時間554ミリ秒に和場合、完全にAHの順序等。

 

 

おすすめ

転載: www.cnblogs.com/qing-gee/p/11605791.html