Java学習ノート-JDK学習Byte、Short、Integer、Long、Booleanなどの基本データ型

4676 ワード

intは私たちがよく言う整形数字で、Javaの8つの元のデータ型(Primitive Type,boolean,byte,short,char,int,foat,double,long)の一つです.Java言語はすべてオブジェクトと呼ばれていますが、元のデータ型は例外です.
1、自動梱包の概念;
Integerはint対応のパッケージクラスで、intタイプのフィールドにデータを格納し、数学演算、intと文字列間の変換などの基本的な操作を提供します.Java 5では,自動梱包と自動解体機能(boxing/unboxing)が導入され,Javaはコンテキストに応じて自動的に変換でき,関連プログラミングを極めて簡素化した.
demo:
自動梱包:Integer a=5;  --→  Integer a =  new Integer(5);   
自動解体:Integer a=5;  --→基本データ型int n=aに直接付与できる.
逆コンパイルで得られたバイトコードの内容から,箱詰め時に自動的に呼び出されるのがIntegerのvalueOf(int)メソッドであることが分かる.ボックスを外すときに自動的に呼び出されるのはIntegerのintValueメソッドで、他のタイプも同じです.
2、Integer.valueOf()の-128~127キャッシュについて;
Integerの値キャッシュについては、Java 5のもう一つの改良が含まれています.Integerオブジェクトを構築する従来の方法は、コンストラクタを直接呼び出し、1つのオブジェクトを直接newすることです.しかし、実際には、ほとんどのデータ操作が限られた、小さな数値範囲に集中していることが分かった.そのため、Java 5に静的ファクトリメソッドvalueOfが追加され、それを呼び出すときにキャッシュメカニズムを利用し、明らかな性能改善をもたらした.Javadocによれば、この値のデフォルトキャッシュは-128~127の間であり、値が小さく頻繁に使用される場合は、プール全体のメソッドを優先的に使用することを推奨します(時間と空間のパフォーマンスが優れています).
ただし、ソースコードによると:
Integer a = 1;//自動キャッシュボックス
Integer a = new Integer(1);//スタックメモリに新しいインスタンスを生成するには、キャッシュされません.
このキャッシュ動作はIntegerオブジェクトだけではありません.すべての整数タイプのクラスに対して同様のキャッシュメカニズムがあります.
ByteCacheは、Byteオブジェクトをキャッシュするために使用されます.
ShortCacheはShortオブジェクトをキャッシュするために使用されます
LongオブジェクトをキャッシュするためのLongCacheがある
CharacterオブジェクトをキャッシュするCharacterCacheがあるByteShortLong固定範囲:-128~127.Characterの場合、範囲は0から127です.
ソースコードによってInteger以外はfinal修飾という範囲は変更できません.
Integerのcache範囲はJVMを変更することで
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high")

実装を構成します.
3、なし/記号タイプあり>>、<
A、有/無符号タイプ
一部の整形は無記号で、例えば年齢、一部の整形は記号を必要とし、在庫のようにC言語にはUnsign変数があるが、Javaにはないが、Java 8の後に無記号変換が増加している.
符号数付きバイナリヘッダは正負を表し,1は負数,0ビット正数である.符号なし数字は正負の首位を代表しない
Byte、Integer有記号を無記号に変換し、範囲が大きくなりました.
符号付きInteger:範囲-2^16~2^16-1
符号なしInteger:範囲0~2^32-1 
だからソースコードの中でIntegerは記号がないLongに変換しました
public static long toUnsignedLong(int x) {
    return ((long) x) & 0xffffffffL;
}
@Native public static final long MAX_VALUE = 0x7fffffffffffffffL;//01111111111111111111111111111111  = 2^32   - 1 

そのうち0 xffffffL Long.MAXVALUEつまりLong符号数の最大値で、&演算を行います 
0101101001と011111111111は演算を行い、0 1が0、1が1の原則に基づいて符号なし数を得た.
Byteはこれと似ています
public static int toUnsignedInt(byte x) {
    return ((int) x) & 0xff;
}

B、<>符号付き変位演算、符号なし>>変位演算
<
byte a = 2; a=<<1はaが左に1桁移動することを示し、2回乗ることを示す.すなわち0000010である. → 00000100=4、左は捨て、右は0を補う、このようにして、a=<<2に2を乗じた2乗=8;
>>右シフト演算:
上とは逆に、a=a>>1は2で割った一次方を表し、a=a>>2は2で割った二次方を表し、右は捨て、左は1つの記号ビットを補充し、正数は0を補い、負数は1を補う.
>>符号なし変位演算:
>>>演算子は、expression 1の各ビットをexpression 2で指定したビット数だけ右に移動します.右に移動して左に空いているビットはゼロで埋められます.右側のビットを移動して捨てられます.
20 >>> 2  補符号(原符号よりビット逆、末尾プラス1):000000000010100 右シフト:0000000000000000101(上位0) 結果:5
C、&/|/^演算
&演算:両方とも1得1、両方とも0得0;
|または演算:2つのうち1つが1である.
^イソOR演算:2つが同じ(11,00)が0.2つが異なるのは1である.
~取反演算子:~0=1,~1=0;
4、Integer等の整形に使用するメモリサイズ
HotSpot仮想マシンでは、メモリに格納されているオブジェクトのレイアウトは、オブジェクトヘッダ(Header)、インスタンスデータ(Instance Data)、整列塗り(Padding)の3つの領域に分けられます. Classオブジェクトポインタ.
HotSpot仮想マシンのオブジェクトヘッダには、ハシコード(HashCode)、GC世代別年齢、ロック状態フラグ、スレッドが持つロック、バイアススレッドID、バイアスタイムスタンプなど、オブジェクト自身のランタイムデータを格納するための2つの部分情報が含まれている.
この部分のデータの長さは32ビットと64ビットの仮想マシン(圧縮ポインタを開かない)のそれぞれ32 bit(4バイト)と64 bit(8バイト)で、公式には「Mark Word」と呼ばれています.オブジェクトヘッダのもう1つの部分は、オブジェクトがそのクラスメタデータを指すポインタ、仮想マシンであるタイプポインタです.
このポインタにより、このオブジェクトがどのクラスのインスタンスであるかを決定します.第3の部分の整列充填は必ずしも存在するわけではなく、特に意味もなく、HotSpot VMの自動メモリ管理システムは、オブジェクトの開始アドレスが8バイトの整数倍でなければならないこと、すなわち、オブジェクトのサイズが8バイトの整数倍でなければならないことを要求しているため、プレースホルダの役割を果たしているだけである.
1.Mark Word:タグビット4バイト、軽量レベルのロックタグビット、バイアスロックタグビットなど.2.Classオブジェクトポインタ:4バイト、オブジェクトに対応するclassオブジェクトのメモリアドレスを指します.3.オブジェクトの実際のデータ:オブジェクトのすべてのメンバー変数.4.配置:パディングバイトを8バイト単位で配置します.Integerはメモリサイズを消費し、4+4+4+4=16バイトです.
5、データスレッド全体のセキュリティ問題
元のデータ型と参照データ型の整数変数は、volatileなどの修飾などの同時関連手段を使用してこそ、スレッドの安全を保証することができることは明らかである.スレッドの安全な計算があれば、AutomicInteger、AutomicLongなどのスレッドの安全クラスを使用することを提案する必要がある.
 
***
[1]基本タイプはいずれも取値範囲があり、大数*大数の場合、境界を越える場合がある.[2]基本タイプ変換の場合は、宣言方式を使用します.例:long result=1234567890*24*365;結果値は、1234567890*24がintの範囲を超えているため、long result=1234567890 L*24*365に変更された場合、あなたが望む値ではありません.普通です.[3]通貨ストレージを基本タイプで処理することを慎む.doubleを使用すると差が生じることが多く、BigDecimal、整数(スコアを正確に表す場合は、値を100倍に拡大して整数に変換することができます)を使用してこの問題を解決します.[4]基本タイプを優先的に使用する.原則として、不用意な梱包・解体行為を避けることを推奨し、特に性能が敏感な場合には[5]スレッドセキュリティの計算が必要であれば、タイプAtomicInteger、AtomicLongのようなスレッドセキュリティクラスの使用を検討することを推奨する.