你好!在學習 JavaRush 時,您不只一次遇到原始類型。以下是我們對它們的了解的簡短清單:
但是,除了值之外,類型的記憶體大小也有所不同。
該類型
- 它們不是對象,代表儲存在記憶體中的值
- 原始類型有以下幾種類型:
- 整數 -
byte
,short
,int
,long
- 浮點數(小數) -
float
和double
- 布林值 -
boolean
- 符號(表示字母和數字)-
char
- 整數 -
- 它們每個都有自己的值範圍:
原始型 | 記憶體大小 | 數值範圍 |
---|---|---|
位元組 | 8位 | -128 至 127 |
短的 | 16位 | 至 -32768 至 32767 |
字元 | 16位 | 從 0 到 65536 |
整數 | 32位 | 從-2147483648 到 2147483647 |
長的 | 64位 | 從-9223372036854775808到9223372036854775807 |
漂浮 | 32位 | 從 (2 的 -149 次方) 到 ((2-2 的 -23 次方)*2 的 127 次方) |
雙倍的 | 64位 | 由 (-2 的 63 次方) 到 ((2 的 63 次方) - 1) |
布林值 | 8(用於數組時)、32(用於非數組時) | 對或錯 |
int
需要超過byte
. A-long
超過short
。基元佔用的記憶體量可以與嵌套娃娃進行比較: 嵌套娃娃內部有可用空間。嵌套娃娃越大,空間越大。long
我們可以輕鬆地將較小的娃娃放入大型嵌套娃娃中int
。它很容易安裝,您不需要做任何額外的事情。在 Java 中,當使用原語時,這稱為自動轉換。換句話說,它被稱為擴展。這是一個簡單的擴充範例:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
byte
這裡我們給一個變數 賦值int
。分配成功且沒有任何問題:儲存在 中的值byte
所佔用的記憶體空間比它「適合」在 中的記憶體空間少int
。「小嵌套娃娃」(值byte
)很容易融入「大娃娃」(變數int
)。當你嘗試做相反的事情時,那就是另一回事了——將一個大值放入一個不是為這種大小設計的變數中。原則上,這個技巧不適用於真正的嵌套娃娃,但在 Java 中它會起作用,但有細微差別。讓我們嘗試將一個值放入int
變數中short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
錯誤!編譯器知道您正在嘗試做一些非標準的事情,並將一個大的俄羅斯娃娃 ( int
) 放在一個小的 ( short
) 中。在這種情況下,編譯錯誤是來自編譯器的警告:「嘿,你確定要這樣做嗎?“如果你確定,請告訴編譯器:“一切都好,我知道我在做什麼!” ” 這個過程稱為顯式類型轉換,或縮小。若要縮小範圍,您需要明確指示要將值轉換為的類型。換句話說,回答編譯器的問題:“那麼,你想把這個大娃娃放入這些小娃娃中的哪一個?” 」 在我們的例子中,它看起來像這樣:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
我們明確表示我們希望將值int
放入變數中short
並對其負責。編譯器看到較窄類型的明確指示後會執行轉換。結果會怎樣呢? 控制台輸出: -27008 有點出乎意料。為什麼會這樣呢?其實很簡單。我們有原始值 - 10000000 它儲存在一個int
佔用 32 位元的變數中,以二進位形式它看起來像這樣: 我們將這個值寫入變量short
,但它只能儲存 16 位元!因此,只有我們的數字的前 16 位將被移動到那裡,其餘的將被丟棄。結果,該變數short
將包含值 ,其十進位形式恰好等於 -27008 這就是編譯器以明確轉換為特定類型的形式「要求確認」的原因。首先,它表明您對結果負責,其次,它告訴編譯器在轉換類型時要分配多少空間。畢竟,如果在最後一個範例中我們將int
類型轉換為byte
,而不是short
,那麼我們將只有 8 位可供使用,而不是 16 位,結果也會有所不同。對於小數類型 (float
和double
),縮小的情況有所不同。如果您嘗試將此類數字轉換為整數類型,則其小數部分將被丟棄。
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
控制台輸出: 2
資料類型 字元
您已經知道 char 類型用於顯示單一字元。public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
但它有許多需要理解的重要功能。讓我們再看一下帶有值範圍的表:
原始型 | 記憶體大小 | 數值範圍 |
---|---|---|
位元組 | 8位 | -128 至 127 |
短的 | 16位 | -32768至32767 |
字元 | 16位 | 從 0 到 65536 |
整數 | 32位 | 從-2147483648 到 2147483647 |
長的 | 64位 | 從-9223372036854775808到9223372036854775807 |
漂浮 | 32位 | 從 (2 的 -149 次方) 到 ((2-2 的 -23 次方)*2 的 127 次方) |
雙倍的 | 64位 | 由 (-2 的 63 次方) 到 ((2 的 63 次方)-1) |
布林值 | 8(用於數組時)、32(用於非數組時) | 對或錯 |
char
的數值範圍是 0 到 65536。但這是什麼意思呢?畢竟,char
這些不僅僅是數字,還有字母、標點符號……事實是,值char
在 Java 中是以 Unicode 格式儲存的。我們在之前的一堂課中已經接觸過 Unicode。您可能還記得Unicode是一種字元編碼標準,其中包括世界上幾乎所有書面語言的字元。換句話說,這是一個特殊代碼列表,其中幾乎包含任何語言的任何字元的代碼。一般的Unicode表很大,當然不需要死記硬背。例如,這裡是其中的一部分: 主要是了解儲存值的原理char
,並記住,知道特定符號的程式碼,您始終可以在程式中取得它。讓我們用一些隨機數字來嘗試:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
控制台輸出:耰 這是Java中字元儲存的格式char
。每個字元對應一個數字 - 16 位元或兩個位元組的數字代碼。Unicode 32816 對應於字元耰。注意這一刻。在這個例子中我們使用了變數int
. 它佔用32位元內存,而char
16位元。這裡我們選擇是因為我們需要的數字 32816 超出了範圍。儘管大小與 Short 一樣是 16 位,但範圍內沒有負數,因此「正」範圍是兩倍大(65536 而不是 32767 )。我們可以使用,只要我們的程式碼在65536的範圍內。但是如果我們建立一個數字,它將佔用超過16位。縮小類型範圍時: int
short
char
char
char
short
int
int >65536
char c = (char) x;
多餘的位將被丟棄,結果將是非常出乎意料的。
字元和整數相加的特點
讓我們來看看這個不尋常的例子:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
控制台輸出: 50 O_O 邏輯在哪裡?1+1,50哪裡來的?!您已經知道,值char
在內存中以 0 到 65536 範圍內的數字存儲,代表我們字元的 Unicode。 所以就是這樣。當我們執行加法時char
,某些整數類型char
會轉換為 Unicode 中與其對應的數字。當我們在程式碼中加入 1 和 '1' 時,符號 '1' 會轉換為其程式碼,即 49(您可以在上表中查看)。因此,結果等於50。讓我們再次以我們的老朋友-耰為例,試著將它與某個數字相加。
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
控制台輸出: 33016 我們已經發現耰對應於代碼32816。當我們將這個數字與200相加時,我們得到的正是我們的結果 - 33016 :) 正如你所看到的,操作機制非常簡單。
GO TO FULL VERSION