javaでプリミティブ型intをArrayListに配置すると、プリミティブ型intがオブジェクト整数に自動的に変更されるのはなぜですか?
6 に答える
Autoboxing
primitive
タイプを適切なwrapper
オブジェクトに自動的に変換します。その背後にある理由は、プリミティブをコレクションに入れることができないためです。Java 5が登場する前は、これを自分で行う必要がありましたが、現在は自動的に処理されます。
詳細については、こちらのリンクを参照してください:http: //docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
これはauto-boxing
Javaで呼び出されます。
Javaプログラマーなら誰でも知っているように、int(または他のプリミティブ値)をコレクションに入れることはできません。コレクションはオブジェクト参照のみを保持できるため、プリミティブ値を適切なラッパークラス(intの場合は整数)にボックス化する必要があります。コレクションからオブジェクトを取り出すと、入力した整数が取得されます。intが必要な場合は、intValueメソッドを使用して整数のボックスを解除する必要があります。このボクシングとアンボクシングはすべて面倒で、コードが乱雑になります。自動ボックス化およびボックス化解除機能はプロセスを自動化し、苦痛と混乱を排除します。
ArrayListはオブジェクトのみを格納できます。intはプリミティブデータ型であるため、同等のオブジェクトに「自動ボックス化」されます。これはJava5の時点でのみ発生し、それ以前は整数を自分でボックス化する必要がありました。
コレクションはプリミティブではなくオブジェクトのみを保持できるため、オートボクシングが発生します。intプリミティブが必要な場合は、それを読み取るときにintValue()メソッドでボックスを解除する必要があります。
これは、Java1.5で導入されたJava言語機能です。これはオートボクシングと呼ばれます。
大まかに言えば、Javaプリミティブ型間で対応するラッパークラス型に変換します。コンパイラーは、受信ボックス(プリミティブからラッパー)または送信ボックス(ラッパーからプリミティブ)が必要な場合(および可能な場合)を検出し、式を正しいバイトコードに拡張します。
そのため、舞台裏では、を追加するとのインスタンスがInteger
リストに追加されますint
。
これをよりよく理解するには、参照型と値型の詳細をお読みください。
ArrayListは、オブジェクトへの参照のみを保持します。値自体は保持されません。
intは値型であるため、参照はありません。intをIntegerに変換するときは、int値を保持するInteger用のスペースと、作成したIntegerオブジェクトへの参照をメモリ内に作成します。
これで、ArrayListは、整数自体を保持するのではなく、所有しているIntegerオブジェクトへのアドレスを保持するだけです。
次のように考えてください。ArrayListの1つの要素がメモリブロック:200を占有します。Integerオブジェクトはメモリブロック:400にあります。メモリブロック200では、整数の値を保持する代わりに、メモリアドレス400を保持します。
理由、わかりません。私は彼らがそれを単純に保つためにこのようにすることに決めたと思います。