1. ホーム
  2. java

Javaにおける8つの基本データ型について解説

2022-02-22 21:20:21
<パス

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が高性能の代償として行っていることがわかりますね。