Javaプリミティブ変換
1. 前書き
Javaは型付き言語であるため、型の概念を利用します。 2つの異なるタイプグループがあります。
-
プリミティブデータ型
-
抽象データ型。
この記事では、プリミティブ型の変換に焦点を当てます。
2. プリミティブの概要
最初に知っておくべきことは、プリミティブ型で使用できる値の種類です。 次の8つのプリミティブタイプがあります。
-
byte –8ビットおよび符号付き
-
short –16ビットおよび符号付き
-
char –16ビットおよび符号なし。Unicode文字を表すことができます。
-
int –32ビットおよび符号付き
-
long –64ビットおよび符号付き
-
float –32ビットおよび符号付き
-
double –64ビットおよび符号付き
-
boolean –数値ではなく、trueまたはfalseの値のみが含まれる場合があります
これは、プリミティブに関する広範な議論を意図したものではなく、変換中に必要に応じて、プリミティブの詳細についてもう少し説明します。
3. プリミティブ変換の拡大
宛先タイプよりも単純または小さいプリミティブから変換する必要がある場合、そのために特別な表記を使用する必要はありません。
int myInt = 127;
long myLong = myInt;
拡大変換中、小さいプリミティブ値は大きいコンテナに配置されます。つまり、値の左側の余分なスペースはすべてゼロで埋められます。 これは、整数グループから浮動小数点に移動するためにも使用できます。
float myFloat = myLong;
double myDouble = myLong;
より広いプリミティブに移動しても情報が失われないため、これが可能です。
4. 縮小プリミティブ変換
変数宣言で使用される型よりも大きい値を収める必要がある場合があります。 一部のバイトを破棄する必要があるため、これにより情報が失われる可能性があります。
この場合、状況を認識していることを明示的に表現する必要があり、キャストを使用してそれに同意します。
int myInt = (int) myDouble;
byte myByte = (byte) myInt;
5. プリミティブ変換の拡大と縮小
この状況はvery specific case when we want to convert from a byte to a charで発生します。 最初の変換は、byteからintへの拡張であり、次にintからcharへの拡張です。
例はこの点を明確にします:
byte myLargeValueByte = (byte) 130; //0b10000010 -126
130のバイナリ表現は-126で同じですが、違いは信号ビットの解釈です。 byteからcharに変換してみましょう。
char myLargeValueChar = (char) myLargeValueByte;
//0b11111111 10000010 unsigned value
int myLargeValueInt = myLargeValueChar; //0b11111111 10000010 65410
char表現はUnicode値ですが、intに変換すると、-126とまったく同じ下位8ビットを持つ非常に大きな値が示されました。
再度byteに変換すると、次のようになります。
byte myOtherByte = (byte) myLargeValueInt; //0b10000010 -126
使用した元の値。 コード全体がcharで始まっていた場合、値は異なります。
char myLargeValueChar2 = 130; //This is an int not a byte!
//0b 00000000 10000010 unsigned value
int myLargeValueInt2 = myLargeValueChar2; //0b00000000 10000010 130
byte myOtherByte2 = (byte) myLargeValueInt2; //0b10000010 -126
byte表現は同じである-126ですが、char表現は2つの異なる文字を提供します。
6. Boxing/Unboxing Conversion
Javaには、各プリミティブ型のWrapperクラスがあります。これは、すべてをヘビーウェイトオブジェクト参照として持つオーバーヘッドなしに、プログラマーに有用な処理メソッドを提供する賢い方法です。 Java 1.5以降、プリミティブとオブジェクト間で自動的に変換したり、逆に変換したりする機能が含まれ、単純な属性によって実現されました。
Integer myIntegerReference = myInt;
int myOtherInt = myIntegerReference;
7. 文字列変換
すべてのプリミティブ型は、ラッパークラスを介してStringに変換できます。これは、toString()メソッドをオーバーライドします。
String myString = myIntegerReference.toString();
プリミティブ型に戻る必要がある場合は、対応するWrapperクラスで定義された解析メソッドを使用する必要があります。
byte myNewByte = Byte.parseByte(myString);
short myNewShort = Short.parseShort(myString);
int myNewInt = Integer.parseInt(myString);
long myNewLong = Long.parseLong(myString);
float myNewFloat = Float.parseFloat(myString);
double myNewDouble = Double.parseDouble(myString);
boolean myNewBoolean = Boolean.parseBoolean(myString);
ここでの唯一の例外はCharacterクラスです。これは、Stringがcharsで構成されているためです。このように、おそらくStringは単一のcharで構成されていることを考慮してください。 s、StringクラスのcharAt()メソッドを使用できます。
char myNewChar = myString.charAt(0);
8. 数値プロモーション
バイナリ演算を実行するには、両方のオペランドにサイズの互換性が必要です。
適用される一連の単純なルールがあります。
-
オペランドの1つがdoubleの場合、もう1つはdoubleにプロモートされます
-
それ以外の場合、オペランドの1つがfloatの場合、もう1つはfloatにプロモートされます
-
それ以外の場合、オペランドの1つがlongの場合、もう1つはlongにプロモートされます
-
それ以外の場合は、両方ともintと見なされます
例を見てみましょう:
byte op1 = 4;
byte op2 = 5;
byte myResultingByte = (byte) op1 + op2;
両方のオペランドがintにプロモートされ、結果を再びbyteにダウンキャストする必要があります。
9. 結論
タイプ間の変換は、毎日のプログラミングアクティビティで非常に一般的なタスクです。 There is a set of rules that govern the ways in which statically typed languages operate those conversions.このルールを知っていると、特定のコードがコンパイルされているかどうかを理解しようとするときに多くの時間を節約できます。
この記事で使用されているコードはover on GitHubにあります。