1. プリミティブ型の一覧

Java には 8 つの基本的なプリミティブ型があります。これらの型の値はオブジェクトではなく、変数内に直接格納されるため、プリミティブと呼ばれます。

これらのタイプに関する簡単な情報をまとめた表を次に示します。

タイプ
バイト単位の サイズ
値の範囲 デフォルト値 説明
byte 1 -128 .. 127 0 最小の整数型はシングルバイトです
short 2 -32,768 .. 32.767 0 短整数、2 バイト
int 4 -2*10 9 .. 2*10 9 0 整数、4バイト
long 8 -9*10 18 .. 9*10 18 0L 長整数、8 バイト
float 4 -10 38 .. 10 38 0.0f 浮動小数点数、4バイト
double 8 -10 308 .. 10 308 0.0d 倍精度浮動小数点数、8バイト
boolean 1 truefalse false ブール型( とtrueのみfalse
char 2 0 .. 65.535 '\u0000' 文字、2 バイト、すべて 0 より大きい
デフォルト値

ところで、ここで重要なニュアンスがあります。インスタンス変数 (フィールド) または静的クラス変数を宣言し、すぐに値を割り当てない場合、デフォルト値で初期化されます。表にこれらの値のリストを示します。

メソッド内のローカル変数にはデフォルト値がありません。このような変数に値を割り当てないと、それらは初期化されていないとみなされ、使用できません。

しかし、プリミティブ型に戻って詳しく見てみましょう。



2. 整数型

Java にはbyte、 、shortintの4 つの整数型がありますlong。それらは、サイズと保存できる値の範囲が異なります。

intタイプ

最も一般的に使用されるのはintタイプです。名前はint eger (整数) という言葉に由来しています。コード内のすべての整数リテラル (整数) は、 ( 、、またはintsで終わっていない場合) です。LFD

このタイプの変数は から-2,147,483,648までの値を取ることができます+2,147,483,647

これは十分な量であり、ほとんどすべての場合に十分です。数値を返すほぼすべての関数は を返しますint

例:

コード 説明
int n = "String".length();
このlength()メソッドは文字列の長さを返します
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
フィールドlengthには配列の長さが含まれます。

shortタイプ

このshort型の名前は から得られますshort int。これは、短整数とも呼ばれることがよくあります。型とは異なりint、その長さはわずか 2 バイトであり、取り得る値の範囲は から まで-32,768です+32,767

つまり、100 万という数字を格納することはできません。あるいは5万でも。これは、Java で最もまれに使用される整数型です。これを使用する主な動機は、メモリを節約することです。

30,000 を超えない値を扱うことになり、これらの値が何百万も存在することが事前にわかっている状況があるとします。

たとえば、10色あたりビット数を使用する超高解像度画像を処理するアプリケーションを作成しているとします。そして、写真には 100 万個のピクセルがあります。intこれは、または を使用するかの決定が重要となるシナリオですshort

longタイプ

この型の名前の由来は、長整数 (long integer)long intとも呼ばれます。型とは異なり、値の範囲は からまでと非常に膨大です。int-9*1018+9*1018

なぜ基本的な整数型ではないのでしょうか?

Java が登場したのは 90 年代半ばで、当時はほとんどのコンピューターが 32 ビットでした。これは、すべてのプロセッサが 32 ビットで構成される数値を処理するように最適化されていることを意味します。プロセッサは 64 ビット整数を処理できますが、その処理は遅くなります。

その結果、プログラマはint標準の整数型を作成し、long本当に必要な場合にのみその型を使用することを合理的に決定しました。

byteタイプ

これは Java で最小の整数型ですが、使用頻度が最も低いというわけではありません。その名前の はbyte、Java でアドレス指定可能なメモリの最小ブロックを表す言葉でもあります。

この型に有効な値はそれほど多くありませんbyte: from-128から+127。しかし、それがその強みではありません。このbyte型は、大きな BLOB データをメモリに保存する必要がある場合に最もよく使用されます。この目的には、 の配列がbyte最適です。

ファイルをどこかにコピーする必要があるとします。

ファイルの内容を処理する必要はありません。必要なのは、メモリ領域 (バッファ) を作成し、そこにファイルの内容をコピーし、そのデータをバッファから別のファイルに書き込むことだけです。これには配列byteが必要です。

配列変数にはメモリ領域への参照のみが格納されることに注意してください。変数が何らかのメソッドに渡されるとき、メモリ アドレスのみが渡されます。メモリのブロック自体はコピーされません。

byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
   int size = sourceFile.read(buffer); // Read data from a file into a buffer
   destFile.write(buffer, 0, size); // Write data from the buffer to a file

   // Stop copying if the buffer is not full
   if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();


3. 実数型

プリミティブ型には、実数用の 2 つの型があります。ただし、この用語を使用するのは完全に正確ではありません。コンピュータが実数を扱うとき、それを浮動小数点数と呼びます。この名前は、数値の整数部と小数部がピリオド (カンマではなくポイント) で区切られる、数値を表す標準に由来しています。

役立つ情報:

各国には数字の書き方に関する独自の基準があります (驚き!)。

多くの人は、千の桁を区切るためにピリオドを使用し、小数点の区切り文字としてカンマを使用することに慣れています。たとえば、次one million ones and 153 thousandthsのように書きます1.000.000,153。しかし、Java の作成者が住んでいた米国では、別の標準が採用されました。1000000.153

doubleJava には、と の2 つの浮動小数点プリミティブ型がありますfloat

前に述べたように、これらの型は非常に特殊な内部配置を持っています。実際、これらの型の各変数の内部には 1 つの数値ではなく、2 つの数値が含まれています。

たとえば、浮動小数点数は987654.321次のように表すことができます。次に、メモリ内では 2 つの数値(仮数、つまり数値の有効部分) と(指数、つまり 10 のべき乗)として表されます。0.987654321*1069876543216

floatタイプ

型の名前は浮動小数点数floatに由来します。この型のサイズは非常に小さく、わずか 4 バイト (32 ビット) ですが、 から までの値を格納できます。仮数を表すために 24 ビットが割り当てられ、指数には 8 ビットが割り当てられます。このタイプは有効数字 8 桁のみを保存できます。-3.4*10383.4*1038

intこのアプローチにより、同じ 4 バイトを使用しながら、よりもはるかに大きな数値を格納できるようになります。しかし、そのためには精度を犠牲にします。メモリの一部には仮数が格納されるため、これらの変数には小数点以下 6 ~ 7 桁のみが格納され、残りは破棄されます。

例:

コード 価値
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

ご覧のとおり、このタイプの主な欠点は、有効桁数が非常に少なく、8 桁目になるとすぐに精度が失われることです。そのため、このfloat型は Java プログラマーの間であまり人気がありません。

doubleタイプ

doubleは標準の浮動小数点型です。名前の由来は倍精度浮動小数点数です。デフォルトでは、すべての実数リテラルはdoubles です。

この型は 8 バイトのメモリ (64 ビット) を占有し、 からまでの値を格納できます。知っておくべき重要な点は、53 ビットが仮数に割り当てられ、残りの 11 ビットが指数に割り当てられることです。-1.7*103081.7*10308

これにより、15 ~ 17 の有効数字を保存できます。

例:

コード 価値
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

この精度は、特にfloat型と比較した場合に決定的であり、実数を使用するすべての演算の 99% が型を使用して実行されますdouble

11-323ビットは指数に割り当てられます。つまり、から までの 10 の累乗 (つまり、から+3082 の累乗)を格納できます。この型は、小数点の後に数百個のゼロを含む数値を簡単に格納できます。-1024+1023double

コード 価値
double a = 2E-300 * 3E+302
600.0


4. インフィニティ

浮動小数点数にはもう 1 つの興味深い特徴があります。それは、無限大を示す特別な値を格納できることです。そして、正の無限大負の無限大を表すことができます。

例:

コード ノート
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

無限大に数値を掛けると、無限大になります。無限大に数値を足すと無限大になります。それはとても便利です。

数字ではありません ( NaN)

無限大を伴う演算はすべて無限大を生成します。まあ、ほとんどではありますが、すべてではありません。

浮動小数点数には、別の特別な値を格納できますNaNN ot a N umber (not a number)の略です。

数学では、無限大を無限大で割った場合、結果は不定になります。

しかし、Java では、無限大を無限大で割ると、結果は になりますNaN

例:

コード ノート
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

NaNyieldを伴うすべての操作NaN



5.charタイプ

Javaのプリミティブ型の中で、特に注意が必要なもの、それがchar型です。その名前はchar acterという単語に由来しており、型自体は文字を格納するために使用されます。

文字というのは文字列からできているものですよね?文字列は文字の配列です。

charしかし、さらに興味深いのは、その型が数値型でもあるという事実です。いわば兼用タイプです。

実際には、charタイプは実際には文字ではありません。代わりに、 Unicode エンコーディングの文字コードを保存します。各文字は数字、つまり文字の数値コードに対応します。

char変数はメモリ内で 2 バイト (型と同じshort) を占有します。ただしshort、型とは異なり、char整数型は符号なしであり、 から0までの値を格納できます65,535

タイプcharはハイブリッドタイプです。その値は、数値 (加算や乗算など) としても文字としても解釈できます。これは、文字は視覚的な表現ではありますが、コンピュータにとっては何よりも単なる数字であるためです。そして、それらを数値として扱う方がはるかに便利です。

ユニコード

Unicodeは、世界中のすべての文字を含む特別なテーブル (エンコーディング) です。そして、各文字には独自の番号が付いています。おおよそ次のようになります。

Javaのプリミティブ型

変数に値を代入するにはさまざまな方法がありますchar

コード 説明
char a = 'A';
変数aにはラテン文字が含まれますA
char a = 65;
変数aにはラテン文字が含まれますA。そのコードは です65
char a = 0x41;
変数aにはラテン文字が含まれますA
コードは です65。これは4116 進数に相当します。
char a = 0x0041;
変数aにはラテン文字が含まれますA
コードは です65。これは4116 進数に相当します。
2 つの追加のゼロは何も変更しません。
char a = '\u0041';
変数aにはラテン文字が含まれますA
コードによって文字を定義するもう 1 つの方法。

ほとんどの場合、文字を引用符で囲むだけで済みます (表の最初の行のように)。とはいえ、後者の方法も人気があります。その利点は、文字列で使用できることです。

そして、先ほど述べたように、char型も整数型であるため、次のように書くことができます。

コード コンソール出力
char a = 'A';
a++;
System.out.println(a);
ラテン文字がB画面に表示されます。
理由:
A65
B66
C67

charの操作

それぞれcharは最初に数字 (文字コード)、次に文字です。文字コードがわかっていれば、プログラム内でその文字をいつでも取得できます。例:

コード コンソール出力
char c = (char) 1128;
System.out.println(c);

Ѩ

標準コード

最もよく知られている文字コードは次のとおりです。

キャラクター コード
0、、、... 1_29 48、、、... 49_5057
a、、、... b_cz 97、、、... 98_99122
A、、、... B_CZ 65、、、... 66_6790


6.booleanタイプ

そして最後のプリミティブ型は ですboolean

すでにご存知のとおり、trueと の2 つの値のみを取ることができますfalse

これで、このタイプについて知っておくべきことはすべてわかりました。