ラッパークラス
Javaは8つの基本タイプがあり、それぞれの基本的なタイプは、対応するラッパークラスを持っています。
それはどのようなパッケージですか?これは基本的なタイプに対応したインスタンス変数内部、格納された値は、データの操作を容易にするために、一般的に、いくつかの静的クラスメソッド、スタティックメソッド、インスタンス変数、あるクラスです。
Java、および以下の表に示されているパッケージの対応の基本的なタイプ:
基本タイプ | ラッパークラス |
ブーリアン | ブーリアン |
バイト | バイト |
ショート | ショート |
int型 | 整数 |
長いです | 長いです |
浮く | 浮く |
ダブル | ダブル |
CHAR | キャラクター |
パッケージングは、念頭に置いても非常に良いですが、整数や文字、クラス名と本質的に同じの他の基本的なタイプに加えて、最初の文字だけが大文字に。
包装それは何を使用ですか?基本型を操作するためにのみ操作対象(例えば、後続の物品コレクションクラスに記載されているような)多くのJavaコードは、データへのアクセスを得ることができ、対応するパッケージは、さらに、ラッパークラスは、多くの有用な方法を提供することを必要とします。
パッケージの基本的な使用は比較的簡単ですが、私たちはその基本的な使い方を紹介するだけでなく、一般的に、比較的少数の機能で使用されるいくつかをご紹介しますだけでなく、より多くのコンテンツを、その実装コードを解析しながら、我々は3つのセクションにこれを紹介します2は、我々は、さらに高度な機能、解析および実装コードをご紹介します後、基本的な使用方法のセクションでは、各ラッパークラスと共通の基盤を説明します。
私たちは、ステップバイステップをご紹介しましょう。
基本タイプとパッケージング
様々な基本的なタイプで見てみましょう、そのラッパークラスは、私たちが直接コードを見て、変換する方法です。
ブーリアン
ブールB1 =偽; ブールBOBJ = Boolean.valueOf(B1); ブール値B2 = bObj.booleanValue()。
バイト
バイトB1 = 123。 バイトbyteObj = Byte.valueOf(B1)。 バイトB2 = byteObj.byteValue()。
ショート
短いS1 = 12345; 短いSOBJ = Short.valueOf(S1)。 短いS2 = sObj.shortValue()。
整数
int型I1 = 12345; 整数iObj = Integer.valueOf(I1)。 INT I2 = iObj.intValue()。
長いです
長いL1 = 12345; 長いlObj = Long.valueOf(L1)。 長いL2 = lObj.longValue()。
浮く
フロートF1 = 123.45f。 フロートfObj = Float.valueOf(F1)。 フロートF2 = fObj.floatValue()。
ダブル
ダブルD1 = 123.45; ダブルdObj =は、Double.valueOf(D1)。 二重D2 = dObj.doubleValue()。
キャラクター
チャーC1 = 'A'; 文字COBJ = Character.valueOf(C1)。 チャーC2 = ChobjkcharValue()。
これらの構造は同様の符号であり、各ラッパー・クラスは、静的メソッドのvalueOf()、また、インスタンスメソッドxxxValue()は、実質的にタイプに対応するリターンを有し、それは参照型を返し、基本型を受け入れるを有しています。
一般的に「ボックス」として知られているパッケージの種類、およびプロセスの基本的な型に変換されたパッケージ・タイプを変換する基本的なプロセスは、と呼ばれ、「開梱」。次のコードに示すように、より詳細なボクシング/アンボクシングライトアップは、Java(登録商標)1.5自動ボックス化とアンボックス化技術を導入した後、直接、参照型、およびその逆の基本的なタイプに割り当てることができます。
整数A = 100。 int型B =;
オートボクシング/アンボクシングは、Javaコンパイラを提供する能力であり、そして背後に、それが対応するコールのvalueOf()/ xxxValue()によって置き換えられます、例えば、上記のコードは、Javaコンパイラで置換されています。
整数A = Integer.valueOf(100)。 INT B = a.intValue()。
各パッケージには、クラスのコンストラクタを持っている、あなたは、たとえば、新しいを作成することができます。
=新しい整数(100)整数。 ブールB =新しいブール値(真の); ダブルD =新しいダブル(12.345)。 文字c =新しい文字( 'MA');
最後に、あなたは静的valueOfメソッド、または新しいITの使用を使用する必要があること?一般のvalueOfを使用することをお勧めします。クラスのオブジェクトキャッシュをパッケージ、その他の包装に加えて、新しいオブジェクト、floatとdoubleを作成するための新しいたびにあなたは、スペース節約、作成パフォーマンスを向上させる、フォローアップ我々は、特定のコードを分析する必要があるオブジェクトの数を減らします。
オーバーライドオブジェクトメソッド
すべてのパッケージのクラスはObjectクラスのメソッドをオーバーライドします。
ブールのequals(オブジェクトobj) int型のhashCode() 文字列のtoString()
私たちは一つ一つを見てください。
イコール
それが現在のオブジェクトに等しく、オブジェクトが同じパラメータに渡されたか否かを判定するため、デフォルトの実装は、2つの変数の比較的オブジェクトクラスアドレスである、唯一の2つの変数が同じオブジェクトを指し、それは真イコールに戻り、比較演算子、および(==)結果は同じです。
しかし、等号は、オブジェクト間の論理的な関係を反映すべきで等しいので、デフォルトの実装は、一般的に不適切である、サブクラスは、この実装をオーバーライドする必要があります。すべてのパッケージングクラスは、この実装をオーバーライドし、パッケージの基本的なタイプであり、実際の比較値は、例えば、メソッドコードに等しいロングタイプ、のためのものです:
パブリックブール等しい(オブジェクトobj){ もし(OBJロングinstanceofの){ 戻り値==((ロング)は、obj).longValue(); } falseを返します。 }
フロートのために、その実装コード:
パブリックブール等しい(オブジェクトobj){ リターン(OBJのinstanceofフロート) &&(floatToIntBits(((FLOAT)OBJ).VALUE)== floatToIntBits(値))。 }
フロートは、静的メソッドfloatToIntBits()、intとして見フロートのバイナリ表現を有します。正確に同じ時間の2つだけフロートのバイナリ表現は、イコールがtrueを返すことに注意してください。:第5節では、我々は、小数の計算は、数学的な概念上の同じ操作の結果が不正確ですが、コンピュータの計算結果は、例えば、以下のコードを見て異なる場合が言及したとき
フロートF1 = 0.01f; フロートF2 = 0.1F * 0.1F。 System.out.println(f1.equals(F2)); System.out.println(Float.floatToIntBits(F1)); System.out.println(Float.floatToIntBits(F2));
出力は次のようになります。
偽 1008981770 1008981771
すなわち、違いが1であり、2つの浮動小数点数ではない同じ、同じでない2進整数として見られる、です。
ダブル、フロートは方法が類似しているに等しく、それは静的メソッドdoubleToLongBitsがあり、比較的長い押し、長い二進表現として見られるだろう。
ハッシュコード
ハッシュコードが来る急速オブジェクト、パケット等を識別するためのハッシュ値は、同じ一般的な主題属性マッピングによって、int型の数であり、オブジェクトのハッシュ値を返します。オブジェクトのハッシュ値が同じオブジェクトのハッシュ値が同じである必要があり、変更することができません。異なるオブジェクトのハッシュ値は、一般的に異なるものでなければならないが、これは必要ではないが、異なるオブジェクトに同じハッシュ値の状況を有することができます。
例えば、学生のためのオブジェクトのクラス、ハッシュコードは、月の日に生まれた学生することができ、誕生日が同じである、一般的には異なる学生異なる誕生日は、より均等に分散され、同じ個体の誕生日は関係ありません。
真のメソッドが返すと等しい場合、ハッシュコードは同じでなければならない2つのオブジェクトのメソッドの緊密な関係をハッシュコードと等しいです。等しいfalseを返し、ハッシュコードが同じであってもよく、または同じではないかもしれないが、異なるように試みる必要がある場合、逆に、必要とされていません。デフォルトの実装では、子クラスのオーバーライドが等しいとき、のhashCodeをオーバーライドする必要があり、ハッシュコード変換対象のメモリアドレスが整数である一般的です。理由はこの規定は、多くのJava APIクラスは、特にコレクションクラスでは、この動作に依存しているため。
バイト、ショート、整数、文字の型の基本的なパッケージに基づいてハッシュコード、ハッシュコード計算された値を上書きするクラスをパッケージ化、ハッシュコードは、その内部値、コードは次のとおりです。
公共int型のハッシュコード(){ (INT)値を返します。 }
ブールの場合、ハッシュコードコード:
公共int型のハッシュコード(){ 戻り値はありますか?1231:1237; }
タイプの値が2つの異なる番号を返された基底クラスによると、なぜこれらの2つの値が何選ぶのか?彼らは自分自身と1つの番号のみで割り切れる素数をしている、我々はフォローアップについて話します、品質の数は優れているが、素数の多くは、なぜ彼らは、プログラマがあるためか、この二つは、ええと、知られていない選択します彼は特別な好みを持っています。
長い間、のhashCodeコード:
公共int型のハッシュコード(){ リターン(INT)(値^(値>>> 32))。 }
高及び低ビット32ビットのXOR演算のための32。
フロートの場合、ハッシュコードコード:
公共int型のハッシュコード(){ 戻りfloatToIntBits(値)。 }
equalsメソッドと同様に、フロートは整数のバイナリ表現として見られます。
ダブルの場合、ハッシュコードコード:
公共int型のハッシュコード(){ 長いビット= doubleToLongBits(値)。 リターン(INT)(ビット^(ビット>>> 32))。 }
そして長い間、その後、長押し計算のhashCodeと見られ、二重バイナリ表現に似等しいです。
イコールとhashCodeについて、我々は後の章で遭遇し、さらに説明します。
各ラッパークラスは、オブジェクトの文字列表現を返すtoStringメソッドをオーバーライドします、これは一般的に、より自然であり、我々は詳細には触れません。
同程度の
各パッケージComparableインタフェースはまた、Java APIを実装し、次のように、Comparableインタフェースのコードは次のとおりです。
パブリックインターフェース匹敵<T> { 公共のintのcompareTo(T O)。 }
<T>私たちのフォローアップ資料に記載され、一般的な文法で、Tは、インタフェースクラスの実装により渡し、比較の種類を表します。compareToインタフェースは、以下に等しく、より、パラメータよりも大きいが、返すべき-1、0を、それぞれ、オブジェクトパラメータと比較する方法、現在のオブジェクトを有しています。
基本的に個々のパッケージは、基本値のクラスタイプに応じて比較され、それが省略されています。ブールのために、真未満偽。フロート及びダブルため、同じ問題が存在し、0.01及び0.1 * 0.1比較結果がゼロではないに等しいです。
パッケージ化と文字列
加算toStringメソッド、パッケージでは、文字列に関連する他の方法があります。
また、文字は、各パッケージは、次のようなオブジェクトを、包装文字列を返す静的クラスのvalueOf(String)メソッドを持っています。
ブールB = Boolean.valueOf( "真"); = Float.valueOf Fフロート( "123.45f")。
また、静的parseXXX(String)メソッドを持って、文字列は、基本的な型の値への復帰を表し、例えば:
ブールB = Boolean.parseBoolean( "真")。 ダブルD = Double.parseDouble( "123.45");
我々は静的に、toString()メソッドを持っていることは、このような基本的なタイプの値として、文字列表現を返します。
System.out.println(Boolean.toString(真)); System.out.println(持つDouble.toString(123.45))。
出力:
真 123.45
整数型、デフォルトの小数点加算の文字列表現のために、また、2進数、8進数、16進数、などの静的方法及び包装、等の他に、他のバイナリ1を表すことができます。
System.out.println(Integer.toBinaryString(12345)); //バイナリ出力 System.out.println(Integer.toHexString(12345)); //出力の16進 System.out.println(Integer.parseInt( "3039"、16)); //進によって解析
出力は次のようになります。
11000000111001 3039 12345
共通の定数
ラッパークラスおよびインスタンスメソッド静的に定義することに加えて、静的変数も定義されています。
ブールタイプ:
public static finalブールTRUE =新しいブール(真の); public static finalブールFALSE =新しいブール値(偽);
すべての数値タイプが定義されてMAX_VALUE MIN_VALUEされ、最大/最小値は、例えば、整数に、表すことができる表します。
public static final int型のMIN_VALUE = 0x80000000から。 public static final int型のMAX_VALUE = 0x7FFFFFFFで、
floatとdoubleはまた、そのようなダブルクラスとして正の無限大、負の無限大、非数値として、特別な値を定義します。
= 1.0 / 0.0のpublic static final二重POSITIVE_INFINITY。 パブリック静的最終ダブルNEGATIVE_INFINITY = -1.0 / 0.0。 public static final二重のNaN = 0.0d / 0.0。
数
数値型ラッパークラスの6種類が共通の親クラス番号を持って、数は以下のメソッドを定義する抽象クラスです。
バイト対応するByteValue() 短い対応するShortValue() int型intValue() 長いのlongValue() フロートに従ってFloatValue() ダブルのdoubleValue()
これらの方法により、クラスのインスタンスは、任意のパッケージ、実質的に数値型を返すことができます。
不変性
クラスは不変クラスでラッパー、それは、オブジェクトのインスタンスが作成されると、それを変更する方法はありません、不変と呼ばれています。これは、の方法によって強制されています。
- すべてのラッパークラスが最終のために宣言され、継承することはできません
- 内部プリミティブ値はプライベートで、最終的な宣言のための
- セッターメソッドが定義されていません。
なぜそれは不変クラスとして定義されなければなりませんか?不変のデータが誤って上書きされる可能性があるので、心配しないで、プログラムをより簡単かつ安全にすることができます、することができます特に、マルチスレッド環境で安全にデータを共有し、。スレッドについては、私たちのフォローアップ記事では説明しています。
概要
このセクションでは、基本的な変換の種類が自動的にボクシング/アンボクシング、オブジェクトオーバーライドメソッド匹敵インタフェース変換と文字列、一般的に使用される定数を包装する包装の基本的な使い方を説明し、数値親クラス、およびパッケージング不変クラス。基本的な日常の用途からは、文字に加えて、他のクラスの内容は、使用するのに十分な基本的な紹介します。
しかし、操作の方法についていくつかの整数とロングビットは、我々は、我々は我々が原則の実現を議論していなかったそれらのいくつかを紹介した文字の方法のほとんどは、私たちは次の2つのセクションで継続させ、そこに導入されていないされています探査。