短い答え:はい、ブール値は32ビットエンティティとして操作されますが、ブール値の配列は要素ごとに1バイトを使用します。
より長い答え:JVMは32ビットのスタックセルを使用し、ローカル変数、メソッド引数、および式の値を保持するために使用されます。1セルより小さいプリミティブはパディングされ、32ビットより大きい(プリミティブおよびダブル)プリミティブは2セルを使用します。この手法は、オペコードの数を最小限に抑えますが、いくつかの奇妙な副作用(バイトをマスクする必要性など)があります。
配列に格納されたプリミティブは32ビット未満を使用する場合があり、配列からプリミティブ値をロードおよび格納するためのさまざまなオペコードがあります。ブール値とバイト値はどちらもbaload
とbastore
オペコードを使用します。これは、ブール配列が要素ごとに1バイトを取ることを意味します。
インメモリオブジェクトレイアウトに関する限り、これは「プライベート実装」ルールでカバーされ、1ビット、1バイト、または別の投稿者が指摘したように、64ビットのダブルワード境界に配置できます。ほとんどの場合、基盤となるハードウェアの基本的なワードサイズ(32ビットまたは64ビット)が必要です。
ブール値が使用するスペースの量を最小限に抑える限り、ほとんどのアプリケーションでは問題になりません。スタックフレーム(ローカル変数とメソッド引数を保持する)はそれほど大きくありません。大きなスキームでは、オブジェクト内の離散ブール値もそれほど大きくありません。多数のブール値を持つ多数のオブジェクトがある場合は、ゲッターとセッターを介して管理されるビットフィールドを使用できます。ただし、CPU時間にペナルティを支払うことになりますが、これはおそらくメモリのペナルティよりも大きくなります。