基本データ型
特殊なタイプのJavaクラス(クラス)とは異なる基本型、または内蔵型と呼ばれます、。彼らは、私たちのプログラミングで最も頻繁に使用されるタイプです。
Javaは最初の変数のデータ型は、最初の変数を初期化するために、変数代入と呼ばれる、記載しなければならないと宣言、強く型付けされた言語です。
8つの基本タイプがありますJavaのプリミティブ型は、次の3つのカテゴリに分けることができます。
文字型 char
ブーリアン boolean
整数型の byte
、short
、int
、long
浮動小数点型 float
、double
。
Javaの数値型は、符号なし存在していないマシンは、オペレーティングシステムやハードウェア環境が変更された変更されないよう、その範囲は、固定されています。
実際には、Javaは、まだあります別の基本的なタイプはvoid
、それはまた、対応するラッパークラスを持っているが、我々は直接に操作することはできません。 java.lang.Void
基本データ型の利点は何ですか
我々は、すべてのJava言語では、ということを知っているnew
我々は、参照スタックによってこれらのオブジェクトを使用して、オブジェクトをヒープに格納されているので、それはオブジェクト自体がリソースを消費するです。
私たちは、この変数を使用するたびに、新しいJavaオブジェクトを必要とする場合は、intなど、頻繁に使用されるタイプ、などのために、そして、それはかなり煩雑になります。
したがって、およびC ++のように、Javaは基本データ型を提供し、変数などのデータは、新たな創造の使用を必要としない、彼らは、ヒープ上に作成されることはありませんが、スタックメモリに直接保存されているので、より効率的です。
整数の範囲
Javaは、整数は、主に含まれbyte
、short
、int
とlong
示さ4つのデジタル範囲は、それらが関連するデータを格納する際に小から大へ、バイト数が占有なぜ異なる主な理由の範囲を表してあります。
短応答科学への最初の1バイト= 8ビット(ビット)。Javaは、シンボルの整数に属します。
8ビットデジタル演算の最初の外観は、で表すことができます。
最小值:10000000 (-128)(-2^7)
最大值:01111111(127)(2^7-1)
これらの整数型、
-
バイト:変数を初期化するときに格納する1つのバイトでバイト、127(^ 7-1 2)〜-128(7 ^ -2)の範囲内で、バイト0は、デフォルトのタイプです。
-
32,767(^ 15-1 2)2ストレージのバイト、-32,768(-2 ^ 15)を有する短い、Javaのため、一般的には、変数、短いタイプのデフォルト値0を初期化するとき:ショート遷移自体理由は、直接ゼロに書き込むことができます。
-
INT:変数、int型のデフォルト値0を初期化したときに4つのバイトをINTは、2,147,483,647(2 ^ 31-1)に2,147,483,648(-2 ^ 31)の範囲内に、記憶されています。
-
長い:長期保存の8バイト、-9,223,372,036,854,775,808範囲(-2 ^ 63)に9223372036、854775807(2 63 -1)、初期化変数、long型または0L 0Lデフォルト値であってもよいですゼロに直接書き込みます。
- ダブルバイト文字の短いint型の長いフロート1 2 2 4 8 4 8
行う方法の範囲を越えて
上記述べ、整数、各タイプは表現の特定の範囲を有し、但し、プログラムの一部の計算は、表現、即ちオーバーフローの範囲を超えることになります。次のコードのように:
int i = Integer.MAX_VALUE;
int j = Integer.MAX_VALUE;
int k = i + j;
System.out.println("i (" + i + ") + j (" + j + ") = k (" + k + ")");
出力:I(2147483647)+ J(2147483647)= K(-2)
これは、オーバーフロー、時間が起こっていると例外をスローし、任意のプロンプトを表示せずしないものです。だから、ときに、プログラムでは、データ操作の同じタイプを使用して、我々はデータのオーバーフローの問題に注意を払う必要があります。
ラッパークラス
Javaはオブジェクト指向言語であるが、Javaでの基本データ型の実際の使用には多くの不都合が各データ型基本設計のためのデザイン部門では、この問題を解決するために、存在しており、オブジェクト指向ではありませんパッケージング(ラッパークラス)と呼ばれる8つの基本データ・タイプおよび対応するクラスように、それは、対応するクラスの代表です。
java.langパッケージは、パッケージング、基本データ型のパッケージング及び以下の対応関係テーブルを配置しています
基本データ型 | ラッパークラス |
---|---|
バイト | バイト |
ブーリアン | ブーリアン |
ショート | ショート |
CHAR | キャラクター |
int型 | 整数 |
長いです | 長いです |
浮く | 浮く |
ダブル | ダブル |
8クラス名で、将来の整数および文字タイプ、他の6つのクラス名や基本データ型の同じクラス、大文字のクラス名の最初の文字だけに加えてインチ
なぜ我々は、包装が必要なのか
多くの人が疑問には、効率を向上させるためにはJavaのために、それは8つの基本データ型を提供しています、なぜ我々はそれをパッケージ提供する必要がありますか?
問題は、実際には、すでにJavaはオブジェクト指向言語であるため、多くの場所ではなく、プリミティブデータ型のオブジェクトを使用する必要があり、回答されて。たとえば、コレクションでは、我々は彼らに、ダブルなどint型することはできません。コンテナ要素は、請求項オブジェクトタイプに設定されているため。
基本的なタイプでも機能オブジェクトを持たせるためには、オブジェクトのプロパティを持っているように、「包む」、および操作の基本的な種類を豊かにするためのプロパティとメソッドを追加するための基本的なタイプに対応するパッケージタイプを、登場。
梱包および開梱
だから、基本データ型とパッケージングと、確かにあなたがそれらの間で切り替えたいがございます。例えば、パッケージ型int Integerオブジェクトに基本データ型を変換します。
私たちは英語ボクシング、ボクシングのために中国語の翻訳に対応し、包装は、包装の基本的なタイプなので、基本的なデータ型変換プロセスはラッパークラスのパッケージに再生されていると信じています。
逆に、基本データのパッケージ化プロセスを変換することは、英語、開梱の中国語の翻訳に対応するアンボクシング、アンパックです。
JavaのSE5する前に、次のコードにより、梱包されます。
Integer i = new Integer(10);
開梱自動および自動包装
JavaのSE5では、開発者の作業を軽減するために、Javaは自動包装を提供し、自動機能を開梱。
オートボクシング:自動的に対応する基本データ型のパッケージに変換されます。
自動アンボクシング:ラッパーは自動的に対応する基本データ型に変換されます。
Integer i =10; //自动装箱
int b= i; //自动拆箱
Integer i=10
代替Javaは開発者に手動で新しいIntegerオブジェクトを必要としない自動梱包機能を提供しているためで、私たちを支援します。 Integer i = new Integer(10);
オートボクシングと自動アンボクシングの原則
今、Javaは自動的に私を可能にする機能を提供することを、我々は最後に、見ていきますJavaは自動機能がどのように達成するために私を可能にしているものを原則、です。
私たちは、自動入力ボックスのために、次のコードを持っています:
public static void main(String[]args)
{
Integer integer=1; //装箱
int i=integer; //拆箱}
上記のコードの後に次のコードをデコンパイルすることができます。
public static void main(String[]args)
{
Integer integer=Integer.valueOf(1);
int i=integer.intValue();}
上記から分かるように、コードを逆コンパイル、オートボクシングint型によるものであるInteger.valueOf()
方法を達成するために、整数アンボクシングは、自動によるものであるinteger.intValue
達成しました。読者が興味を持っている場合は、8種類を試すことができ、再度逆コンパイルしている、あなたは、次のルールがあります:
自動包装ラッパークラスがされていることにより、
valueOf()
包装して、クラスオブジェクトを自動的にアンパックするための方法を実装されてxxxValue()
達成しました。
どのような場所が自動的に入力ボックス
私たちが見て、原理を理解した後、どのような状況の下で、Javaのは、私たちは自動入力ボックスを実行するのに役立ちます。上記のシーン変数の初期化と割り当てが導入されていない、それが最も簡単で最も容易に理解されます。
私たちは、主に無視されることがあり、これらのシナリオを見てください。
シナリオ、基本データ型のコレクションに
我々は、それが与えられていない理由のJavaコレクションクラスは唯一のオブジェクト型、そして次のコードを受け取ることができる、ということを知っていますか?
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i ++)
{
li.add(i);}
上記逆コンパイルコード、次のコードを得ることができます。
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
{
li.add(Integer.valueOf(i));}
以上、私たちは、コレクションクラスに基本的なデータ型を入れたときに、それが自動的に梱包します、と結論付けることができます。
2つ目のシナリオは、パッケージの種類と基本的な種類のサイズ比較
誰もが今まで考えた、私たちはIntegerオブジェクトの基本型のサイズを比較したときに、実際には、それを比較することは何ですか?次のコードを見てください:
Integer a=1;
System.out.println(a==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool?"真":"假");
、上記の次のコードをコードをコンパイルするには:
Integer a=1;
System.out.println(a.intValue()==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool.booleanValue?"真":"假");
包装作業基本データ型を比較すると、第1の包装アンパックに基本データ型で見られ、そして次に比較することができます。
操作のシナリオ3つのパッケージタイプ
我々はIntegerオブジェクトの4つの操作をしたとき、誰もがそれがどのように、について考えていますか?次のコードを見てください:
Integer i = 10;
Integer j = 20;
System.out.println(i+j);
次のように逆コンパイルコードの後に次のとおりです。
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(20);
我々は2つの間の包装作業のタイプは、基本的な種類に自動的に解凍されますことを見出しました。
シーン4、三項演算子を使用して
これは、ラインの流血学んバグ作者が発生した後、多くの人々がシーンのケースを知らないものです。シンプルな三項演算子のコードを参照してください。
boolean flag = true;
Integer i = 0;
int j = 1;
int k = flag ? i : j;
多くの人が、実際には、には分からないint k = flag ? i : j;
、このライン、オートアンボクシング起こります。次のように逆コンパイルコードの後に次のとおりです。
boolean flag = true;
Integer i = Integer.valueOf(0);
int j = 1;
int k = flag ? i.intValue() : j;
これは実際の三項演算子の構文の仕様である:オブジェクトは、実質的に動作タイプをアンパックであろう第2の及び第三のオペランドが、基本的なタイプ及びオブジェクトである場合。
例えばので、flag ? i : j;
セグメントは、第二セグメントは、iが第三段階jは基本型であるが、パッケージは自動的にアンパックし、包装の種類のオブジェクトです。i値この時間ならばnull
、そう長くNPEが発生します。
シーンファイブ、関数のパラメータと戻り値
これは、直接コードを、理解することは簡単です:
//自动拆箱
public int getNum1(Integer num) {
return num;
}
//自动装箱
public Integer getNum2(int num) {
return num;
}
自動入力ボックスとキャッシュ
また、Java SE自動入力ボックスとは、バッファ関連機能を提供し、以下のコードを見てみましょう、出力を推測:
public static void main(String... strings) {
Integer integer1 = 3;
Integer integer2 = 3;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 300;
Integer integer4 = 300;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}
私たちは、一般的に上記の二つの判定結果が偽であると考えています。比較の値は同じであるが、比較がオブジェクトであり、オブジェクト参照が同じではないので、2つの判断が偽であればと思うだろうのでけれども。
Javaでは、==比較は、ターゲット・アプリケーションであり、その値は比較に等しくされます。
したがって、この例では、異なるオブジェクトは、異なる参照を持っているので、作るときの比較はfalseを返します。不思議なことに、どこ2と同様の条件の異なる判断がブール値を返す場合。
実際の出力上記のコード:
integer1 == integer2
integer3 != integer4
その理由は、キャッシュと整数のメカニズムです。Java 5のでは、オペレーティング整数で、我々はメモリを節約し、パフォーマンスを向上させるための新機能をご紹介します。Integer型のオブジェクトは、同じオブジェクト参照を使用して、キャッシュと再利用を実装しています。
127に全体の値の範囲-128に適用されます。
自動包装のためにのみ適しています。適用されないオブジェクトを作成するためにコンストラクタを使用します。
私達はちょうど直接オブジェクトを再作成するのではなく、キャッシュ内のオブジェクトを使用しますが、数は-128〜127の間で自動包装の必要性が、ある場合とき知っておく必要があります。
請求項127に-128の間のキャッシュのJavadocサポート自動包装プロセスの詳細な説明。127の最大値ができ-XX:AutoBoxCacheMax=size
修正すること。
実際には、この関数は+127へのJava 5、-128の一定の範囲内に導入されたとき。その後、Java 6の中で、あなたができるjava.lang.Integer.IntegerCache.high
最大値を設定します。
これは、私たちはアプリケーションの実際の状況を調整するための柔軟性のパフォーマンスを向上させることができます。最終的には-128〜127の範囲にそれを選択する理由は何ですか?この範囲内の数字は、最も広く使用されているため。 プロセスでは、整数の最初の使用は、また、キャッシュを初期化するためにいくつかの余分な時間がかかります。
次のようにJava言語仕様(JLS)ボクシング変換部で提供しています。
p個の変数の値がある場合:
-128至127之间的整数(§3.10.1)
true 和 false的布尔值 (§3.10.3)
‘\u0000’至 ‘\u007f’之间的字符(§3.10.4)
範囲内で、Pパッケージ二つのオブジェクトA、Bは、== BはAとBを使用して直接決定することができる場合に等しいです。
質問箱は、自動解体をもたらします
もちろん、自動入力ボックスを使用すると、入力ボックスを必要なときに最後に気にする必要はもはやエネルギーの開発を節約、便利な機能ではありません。しかし、彼はまた、いくつかの問題を紹介します。
数値比較ラップされたオブジェクトは、単純に使用することができない
==
数は-128と127の間とすることができるが、この範囲外依然として使用する必要があるequals
比較を。
先に述べたように、いくつかのシーンは自動的に私を可能にするだけでなく、パッケージングクラスオブジェクトがnullの場合による自動ボックス化解除に、開梱時に自動的にNPEをスローすることが可能であることを言っただろう。
入力ボックスの操作の数が多いためにループした場合、多くのリソースを浪費することになります。