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