Javaにおける8つの基本データ型について解説
8つの基本データ型
Java言語がリリースされて以来、その一部となっている基本データ型は、***byte, short, int, long, char, float, double, boolean*** です。もちろん、これらの基本データ型にまつわる面接の質問はたくさんありますが、正直なところ、職場で使われることはあまりありません
例えば
boolean 何バイトか、charは漢字を表現できるか、など。
8つのタイプは4つに細分化され、以下のように区分される。
整数:byte、short、int、long
文字型:char
浮動小数点: float, double
ブーリアン:ブーリアン
詳しく説明する前に、Javaの計算の最小単位は***バイト***であり、1バイト=8ビット(bit)であることを知っておくと便利です。以下に、各基本型に対応するデフォルト値を列挙します。
<テーブル データの種類 デフォルト値 バイト 0 短い 0 int 0 長い 0L フロート 0.0f ダブル 0.0d チャー '\u0000' 文字列(または任意のオブジェクト) ヌル ブーリアン 虚偽
ここで、もうひとつ情報を。プログラミング言語であるjavaは
Static type
というのは、変数を使う前に宣言しなければならないので、次のように変数の型を先に宣言してはいけないのです。
int test = 1;
javaの変数の型は、今日学んだ基本型と参照型の2種類に大別されます。
基本型が必要な理由
このセクションを学ぶ前に、実はちょっとした基礎知識が必要です。それは、私が書いたこの記事で見ることができるラッパーの型です。 Javaデータ型 - ラッパークラス Javaはオブジェクト指向のプログラミング言語ですが、なぜJavaは基本的なデータ型、つまりオブジェクト型ではないデータ型を提供するのでしょうか?
これは、Javaではオブジェクトの作成はコストがかかる作業であり、さらに基本データ型は広く使われており、Stringのように、JavaはStringに対して多くの最適化を行っていることが分かっており、ここでJavaはプログラムを効率化するために基本データ型を提供しているのです。
ラッパーの型はイミュータブルであることに注意してください
I. 整数
Javaにおける整数データは 符号付き数値 つまり、正の整数の場合は最初のビットが0、負の整数の場合は最初のビットが1になります。コンピュータでは 負の数は補数で表現されます では、補数はどのように計算されるのでしょうか。
補数=ソースコードの逆数+1。
というように。
22というのは、コンピュータの中では00010110と表現され
-22を逆算したもの。11101001に1を足すと11101010
バイト
バイトはJavaの整数型に属し、長さは1バイト8ビット、値は10000000(-128)から01111111(127)、変数の初期化デフォルト値は0、ラッパークラスのByteです。
短い
shortはJavaの整数型に属し、長さは2バイト16ビット、値は10000000 00000000 (-32768) から 0111111111 (32767) を取り、変数の初期化デフォルト値は0、ラッパークラスShortです。
int
intはJavaの整数型に属し、長さは4バイト32ビット、値は-2^31 (-2,147,483,648) から 2^31-1 (2,147,483,647) を取り、変数の初期化デフォルト値は0、ラッパークラスIntegerです。
長い
long は Java の整数に属し、長さは 8 バイト 64 ビット、値は -2^63 (-9,223,372,036,854,775,808) から 2^63-1 (9,223,372,036,854,775,8087) で、変数の初期化デフォルト値は 0 または 0L、ラッパークラス Long です。
II. 浮動小数点型
Javaにおける浮動小数点データは、2進数で直接表現することはできませんが、 [IEEE 754](https://baike.baidu.com/item/IEEE 754/3869922)規格に従った実数の近似的なデータ表現である
フロート
floatは、Javaの浮動小数点型に属し、単精度浮動小数点型とも呼ばれ、長さ4バイト32ビット、変数の初期化デフォルト値0.0f、ラッパークラスFloatです。
1. フロート構造
3つのパーツが含まれています。 符号ビット、指数ビット、末尾ビット
<テーブル 符号ビット(s) 指数ビット(E) 仮数 (M) 長さ 1ビット 8ビット 23ビット 説明 正の数なら0、負の数なら1 フォーマットは , E値の範囲。(0,255), 指数ビットの取り方: ( は、その ここで、1.MはE=0のときにとられ、フォーマルフォームと呼ばれ、0.MはE!=0のときにとられ、インフォーマルフォームと呼ばれます。2. floatが値を取る
通常のフォームです。
非公式な形式。
上記の式から、floatの値の範囲を次のように簡単に計算することができます。
(符号ビットSが1を取り、指数ビットEが255を取る場合の最小値です。)
(符号ビットSが0、指数ビットEが255のときの最大値です。)
その中間のおおよそのデータを取ることができます。
<ブロッククオート注)指数や末尾の桁の値によって、NAN、正の無限大、負の無限大など多くの特殊なケースがありますが、通常は使用しませんので、ここでは深入りしません。また、近似値ですので、金額を表すことはできず、金額を表すにはBigDecimalを使用することが推奨されます
ダブル
doubleはJavaの浮動小数点型に属し、倍精度浮動小数点型とも呼ばれ、長さは8バイト64ビット、変数の初期化デフォルト値0.0d、ラッパークラスDoubleです。
1. 二重構造
3つのパーツが含まれています。 符号ビット、指数ビット、末尾ビット
<テーブル 符号ビット(s) 指数ビット(E) 仮数 (M) 長さ 1ビット 11ビット 52ビット 説明 正の数なら0、負の数なら1 フォーマットは , E値の範囲。(0,2047), 指数ビットの取り方: ( は、その ) ここで、1.MはE=0のときにとられ、フォーマルフォームと呼ばれ、0.MはE!=0のときにとられ、インフォーマル・フォームと呼ばれます。2. 値を二重に取る
通常のフォームです。
非公式な形式。
上記の式から、doubleの値の範囲を次のように簡単に計算することができます。
<イグ
(符号ビットSが1を取り、指数ビットEが2047を取る場合の最小値)
(符号ビットSが0、指数ビットEが2047のときの最大値です。)
その中間のおおよそのデータを取ることができます。
<ブロッククオート注)指数や末尾の桁の値によって、NAN、正の無限大、負の無限大など多くの特殊なケースがありますが、通常は使用しないのでここでは深入りしません。また、近似値なので金額を表すことはできず、金額を表すにはBigDecimalを使用することが推奨されます
III. キャラクタータイプ
チャー
charはjavaの文字型です。2バイト16ビットを占有し、1文字と整数値を代入することができます。
例えば
char a = 'a';
char a = 'in';
char a = 12; // char 型は ASCII 文字エンコーディングに対応する値を持っているので、0~65536 の範囲を取り、文字テーブルの対応する文字を出力するために直接操作を行うことができます。
@Test
public void testChar() {
//any single character, plus single quotes.
char a1 = 'a';
//any single Chinese character, plus single quotation marks.
char a2 = 'you';
//integer. 0~65535. decimal, octal, hexadecimal are available. Output the corresponding character in the character encoding table.
char a3 = 114;
System.out.println(a3);
}
もうひとつは、char型 数学演算をサポートしています。 この原理は、charを対応する数字に変換し、その数字を文字テーブルの文字に対応するように計算できるため、その結果が新しい文字になるというもので、char型の演算結果がどうなるかは、以下のスクリーンショットをご覧ください。
演算結果がint型であることがわかりますが、このint型に0~65536の範囲でcharを代入しています
もうひとつは、よく使う
+
そのため、2つの文字をつなぎ合わせたいときは
+
これはchar型に対する加算操作なので、基本的にchar型は数値型と考えることができます。
@Test
public void testCharOperation() {
char a1 = 'a' + 'b';
System.out.println(a1);
String a2 = "a" + "b";
System.out.println(a2);
}
// Output the result
Ã
ab
つまり、基本的にcharを数値型として扱えることがわかったら、charと数値型を使った計算を試してみましょう、先に試してみてください、あるいは私が先に試してみます
@Test
public void testCharOperation() {
char a1 = 'a' + 1;
System.out.println(a1);
}
//output result
b
IV. ブーリアン
booleanはtrueとfalseの2つの値しか持ちません。 変数初期化デフォルト値false
ブーリアンは何バイトを占有するのですか?
なぜこのような質問をするのか?まず、Javaで定義されている8つの基本データ型のうち、メモリフットプリントがバイト単位で明確な他の7つの型を除いて、boolean型はバイト単位で特定のフットプリントを持ちません。これは、仮想マシンにはbooleanという型が存在せず、boolean型はコンパイル後に他のデータ型を使って表現することになるためです。boolean型は何バイトを消費するのでしょうか?もちろん、この時点でいろいろな答えが返ってくるはずです。
まず、他の基本データ型のロックが占めるバイトのサイズを見る方法を見てみましょう。よく基本データ型が占めるバイトのサイズについての表やグラフを見ますが、覚えられないので、ハハハ、この方法があることさえ知っていれば、次はBaiduなしで自分でやることができます
System.out.println(Byte.SIZE);// 8
System.out.println(Short.SIZE);// 16
System.out.println(Integer.SIZE); // 32
System.out.println(Long.SIZE); // 64
System.out.println(Character.SIZE); //16
System.out.println(Float.SIZE); //64
System.out.println(Double.SIZE); //64
//System.out.println(Boolean.SIZE); //32
結果は出力されますが、boolean のラッパークラスである Boolean は、このようなプロパティを提供しないことに注意してください。
8
16
32
64
16
32
64
1ビット
これは、boolean型の論理値がtrueとfalseの2つだけで、1と0を使うようにコンパイルされているためで、この2つの数値を記憶するためには、メモリ上に1ビット(bit)あればよく、bitはコンピュータにおける記憶の最小単位である。
1バイト
理由は、コンパイルされた1と0だけ空間の1ビットを占有する必要がありますが、コンピュータ処理データの最小単位は1バイトであり、1バイトは8ビットに等しく、実際のストレージスペースは次のとおりです。
4バイト
その理由は、Java Virtual Machine Specification bookの記述にあります: "booleanデータ型は定義されていますが、非常に限定的なサポートしか提供されていません。Java言語の式で操作されるboolean値は、代わりにJava Virtual Machineのintデータ型を使ってコンパイルされ、boolean配列はJava Virtual Machineのバイト配列としてエンコードされ、boolean要素はそれぞれ8ビットで占有されますquot;. このように、boolean型はそれ自体で4バイト、配列の中でさらに1バイトを占めると結論づけることができます。
では、なぜVMはbooleanではなくintを使うのでしょうか?なぜ、よりメモリ効率の良いbyteやshortを使わないのでしょうか。調べてみると、データを32ビットずつ処理する現在の32ビットプロセッサ(CPU)にとって(ここでいう32/64ビットシステムではなく、CPUのハードウェアレベルで)、効率よくアクセスできることがintを使う理由であることがわかった。
Although the java virtual machine defines a boolean type, it only provides very limited support for it. Instead, expressions in the java programming language that operate on boolean values are compiled to Instead, expressions in the java programming language that operate on boolean values are compiled to use values of the java virtual machine int data type.
The java virtual machine does directly support boolean arrays. Its newarray instruction enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instruction baload and bastore .
In Oracle java virtual machine implementation, boolean arrays in the java programming language are encoded as java virtual machine byte arrays, using 8 .
The java virtual machine encodes boolean array components using 1 to represent true and 0 to represent false . Where java programming language boolean values are mapped by compilers to values of java virtual machine type int , the compilers must use the same encoding
実際に、Javaが高性能の代償として行っていることがわかりますね。
関連
-
IllegalArgumentException この例外を解決する方法
-
jd-gui Java Exceptionが発生しました。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
SpringBootApplication を型解決できない。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
Swagger の @ApiModelProperty オブジェクト フィールドが表示されない
-
VectorのJavaコレクションを徹底解析
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
Javaエラーメッセージがenclosingクラスでない
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
HttpClientがGZIP形式でない場合の対処法
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
response.sendRedirectによる不具合とその対処法