1. 基本類型列表

Java 有 8 種基本原始類型。它們之所以被稱為原始類型,是因為這些類型的值不是對象,而是直接存儲在變量中。

下表包含有關這些類型的一些簡要信息:

類型
字節 大小
取值範圍 默認值 描述
byte 1個 -128 .. 127 0 最小的整數類型是單字節
short 2個 -32,768 .. 32.767 0 短整數,兩個字節
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個 true,false false 布爾類型(只有trueand false
char 2個 0 .. 65.535 '\u0000' 字符,2個字節,全部大於0
默認值

順便說一句,這裡有一個重要的細微差別。如果您聲明了一個實例變量(字段)或一個靜態類變量並且沒有立即為其分配任何值,那麼它會被初始化為一個默認值。該表列出了這些值。

方法中的局部變量沒有默認值。如果您不為此類變量賦值,則它們將被視為未初始化且無法使用。

但是讓我們回到原始類型並仔細研究它們。



2. 整數類型

Java 有 4 種整數類型:byteshortintlong它們的大小和可以存儲的值的範圍不同。

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,它的長度只有兩個字節,可能值的範圍是從-32,768+32,767

這意味著您不能在其中存儲數字一百萬。甚至50,000。這是 Java 中最不常用的整數類型。使用它的主要動機是節省內存。

假設您事先知道您將使用永遠不會超過 30,000 的值,並且這些值將有數百萬個。

例如,假設您正在編寫一個處理超高清圖片的應用程序,10每個顏色使用 - 位。你的照片有一百萬像素。int這是決定使用或事項的場景short

long類型

這種類型得名於long int,也稱為長整型。與類型不同int,它的取值範圍非常大:從到。-9*1018+9*1018

為什麼它不是基本整數類型?

因為 Java 出現在 90 年代中期,當時大多數計算機都是 32 位的。這意味著所有處理器都針對處理由 32 位組成的數字進行了優化。處理器可以處理 64 位整數,但對它們的操作速度較慢。

因此,程序員合理地決定製作int標準整數類型,並long僅在真正需要時才使用該類型。

byte類型

這是 Java 中最小的整數類型,但遠非最少使用。它的名稱byte也是 Java 中最小可尋址內存塊的代名詞。

bytetype: from -128to的有效值不多+127。但這不是它的強項。byte當您需要在內存中存儲大型 blob 數據時,最常使用該類型。s數組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.真實類型

基本類型包括兩種實數類型。儘管使用該術語並不完全準確。當計算機處理實數時,我們稱它們為浮點數。該名稱來自表示數字的標準,其中數字的整數和小數部分由句點(點,而不是逗號)分隔。

一些有用的信息:

每個國家都有自己的數字書寫標準(驚喜!)。

很多人習慣用句點分隔千位,用逗號作為小數點分隔符:例如,他們會one million ones and 153 thousandths寫成1.000.000,153. 但是在 Java 的創造者居住的美國,採用了不同的標準:1000000.153

Java 有兩種浮點基本類型:doublefloat.

正如我們前面所說,這些類型有一個非常特定的內部安排:實際上,這些類型的每個變量內部不是一個數字,而是兩個:

例如,浮點數987654.321可以表示為。然後在內存中它將被表示為兩個數字(尾數,即數字的有效部分)和(指數,即十的冪)0.987654321*1069876543216

float類型

類型的名稱float來自float ing-point number。這種類型的大小非常小——只有 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

如您所見,這種類型的主要缺點是有效數字的數量非常少,並且一到第八位就會失去精度。這就是為什麼該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+308這是二的冪從-1024+1023)。該double類型可以輕鬆存儲小數點後有數百個零的數字:

代碼 價值
double a = 2E-300 * 3E+302
600.0


4.無限

浮點數還有另一個有趣的特性:它們可以存儲一個表示無窮大的特殊值。你可以表示正無窮大負無窮大

例子:

代碼 筆記
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)

任何涉及無窮大的運算都會產生無窮大。好吧,大多數但不是全部。

浮點數可以存儲另一個特殊值:NaN. 它是N ot a N umber(不是數字)的縮寫。

在數學中,如果用無窮大除以無窮大,結果是不確定的。

但是,在 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

任何具有NaNyields的操作NaN



5.char類型

Java的原始類型中,有一個值得特別注意:類型char。它的名字來自單詞char acter,類型本身用於存儲字符。

字符是由字符串組成的,對嗎?字符串是字符數組。

但更有趣的是,該char類型也是數字類型!可以這麼說,這是一種雙重用途的類型。

實際情況是char類型實際上不是字符。相反,它存儲來自 Unicode 編碼的字符代碼。每個字符對應一個數字:字符的數字代碼。

每個char變量在內存中佔用兩個字節(與類型相同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
它的代碼是6541在十六進制中是相等的。
char a = 0x0041;
a變量將包含拉丁字母A
它的代碼是6541在十六進制中是相等的。
兩個額外的零不會改變任何東西。
char a = '\u0041';
a變量將包含拉丁字母A
另一種通過代碼定義字符的方法。

大多數情況下,人們只是簡單地在引號中指明字符(如表的第一行)。也就是說,後一種方法也很受歡迎。它的優點是可以在字符串中使用。

正如我們所說,該char類型也是一個整數類型,所以你可以這樣寫:

代碼 控制台輸出
char a = 'A';
a++;
System.out.println(a);
拉丁字母B將顯示在屏幕上。因為

A———— 65
B_66
C67

char與小號一起工作

每個char首先是一個數字(字符代碼),然後是一個字符。如果你知道一個字符代碼,你總是可以在你的程序中得到這個字符。例子:

代碼 控制台輸出
char c = (char) 1128;
System.out.println(c);

Ѩ

標準代碼

以下是最著名的字符代碼:

人物 代碼
0, 1, 2, ...9 48, 49, 50, ...57
a, b, c, ...z 97, 98, 99, ...122
A, B, C, ...Z 65, 66, 67, ...90


6.boolean類型

最後一個原始類型是boolean.

如您所知,它只能取兩個值:truefalse

這樣,您就已經了解了有關此類型的所有信息。