1. Danh sách các loại nguyên thủy

Java có 8 kiểu nguyên thủy cơ bản. Chúng được gọi là nguyên thủy bởi vì các giá trị của các loại này không phải là đối tượng và được lưu trữ trực tiếp bên trong các biến.

Đây là một bảng với một số thông tin ngắn gọn về các loại này:

Kiểu Kích thước
tính bằng byte
Phạm vi giá trị Giá trị mặc định Sự miêu tả
byte 1 -128..127 0 Loại số nguyên nhỏ nhất là một byte đơn
short 2 -32.768 .. 32.767 0 Số nguyên ngắn, hai byte
int 4 -2*10 9 .. 2*10 9 0 Số nguyên, 4 byte
long số 8 -9*10 18 .. 9*10 18 0L Số nguyên dài, 8 byte
float 4 -10 38 .. 10 38 0.0f Số dấu phẩy động, 4 byte
double số 8 -10 308 .. 10 308 0.0d Số dấu phẩy động có độ chính xác kép, 8 byte
boolean 1 true,false false Kiểu Boolean (chỉ truefalse)
char 2 0 .. 65.535 '\u0000' Ký tự, 2 byte, tất cả đều lớn hơn 0
Giá trị mặc định

Nhân tiện, đây là một sắc thái quan trọng. Nếu bạn khai báo một biến thể hiện (trường) hoặc một biến lớp tĩnh và không gán ngay bất kỳ giá trị nào cho nó, thì nó sẽ được khởi tạo với một giá trị mặc định . Bảng trình bày một danh sách các giá trị này.

Các biến cục bộ trong một phương thức không có giá trị mặc định. Nếu bạn không gán giá trị cho các biến như vậy, chúng được coi là chưa được khởi tạo và không thể sử dụng được.

Nhưng hãy quay trở lại các kiểu nguyên thủy và xem xét kỹ hơn về chúng.



2. Các kiểu số nguyên

Java có 4 kiểu số nguyên: byte, short, intlong. Chúng khác nhau về kích thước và phạm vi giá trị mà chúng có thể lưu trữ.

intkiểu

Loại được sử dụng phổ biến nhất là intloại. Tên xuất phát từ từ int eger (số nguyên). Tất cả các số nguyên (số nguyên) trong mã là ints(nếu chúng không kết thúc bằng L, Fhoặc D).

Các biến loại này có thể nhận các giá trị từ -2,147,483,648đến +2,147,483,647.

Đó là rất nhiều và đủ cho hầu hết mọi dịp. Hầu như mọi hàm trả về một số đều trả về một int.

Ví dụ:

Mã số Giải trình
int n = "String".length();
Phương length()thức trả về độ dài của một chuỗi
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Trường lengthchứa độ dài của mảng.

shortkiểu

Loại shortlấy tên của nó từ short int. Nó cũng thường được gọi là số nguyên ngắn . Không giống như intloại, độ dài của nó chỉ là hai byte và phạm vi của các giá trị có thể là từ -32,768đến +32,767.

Điều đó có nghĩa là bạn không thể lưu trữ số một triệu trong đó. Hoặc thậm chí 50.000. Đây là kiểu số nguyên ít được sử dụng nhất trong Java. Động lực chính để sử dụng nó là để tiết kiệm bộ nhớ.

Giả sử bạn có một tình huống mà bạn biết trước rằng bạn sẽ làm việc với các giá trị không bao giờ vượt quá 30.000 và sẽ có hàng triệu giá trị này.

Ví dụ: giả sử bạn đang viết một ứng dụng xử lý ảnh có độ phân giải cực cao sử dụng 10-bit cho mỗi màu. Và bạn có một triệu pixel trong bức ảnh của mình. Đây là một kịch bản mà quyết định sử dụng inthoặc shortquan trọng.

longkiểu

Loại này lấy tên từ đó long intvà còn được gọi là số nguyên dài . Không giống như intloại, nó có phạm vi giá trị cực kỳ lớn: từ đến .-9*1018+9*1018

Tại sao nó không phải là kiểu số nguyên cơ bản?

Bởi vì Java xuất hiện vào giữa những năm 90, khi hầu hết các máy tính đều là 32-bit. Điều đó có nghĩa là tất cả các bộ xử lý đã được tối ưu hóa để làm việc với các số gồm 32 bit. Bộ xử lý có thể hoạt động với số nguyên 64 bit, nhưng hoạt động với chúng chậm hơn.

Do đó, các lập trình viên đã quyết định hợp lý để tạo intkiểu số nguyên tiêu chuẩn và longchỉ sử dụng kiểu này khi thực sự cần thiết.

bytekiểu

Đây là loại số nguyên nhỏ nhất trong Java, nhưng không phải là loại ít được sử dụng nhất. Tên của nó, byte, cũng là từ dành cho khối bộ nhớ có thể định địa chỉ nhỏ nhất trong Java.

Không có nhiều giá trị hợp lệ cho byteloại: from -128to +127. Nhưng đó không phải là sức mạnh của nó. Loại bytethường được sử dụng nhất khi bạn cần lưu trữ một dữ liệu blob lớn trong bộ nhớ. Một mảng bytes là lý tưởng cho mục đích này.

Giả sử bạn cần sao chép một tệp ở đâu đó.

Bạn không cần xử lý nội dung của tệp: bạn chỉ muốn tạo một vùng bộ nhớ (bộ đệm), sao chép nội dung của tệp vào đó, sau đó ghi dữ liệu đó từ bộ đệm vào một tệp khác. Một bytemảng là những gì bạn cần cho việc này.

Hãy nhớ rằng một biến mảng chỉ lưu trữ một tham chiếu đến một vùng bộ nhớ. Khi biến được truyền cho một số phương thức, chỉ địa chỉ bộ nhớ được truyền. Bản thân khối bộ nhớ không được sao chép.

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. Các loại thực

Các kiểu nguyên thủy bao gồm hai kiểu cho số thực. Mặc dù nó không hoàn toàn chính xác để sử dụng thuật ngữ đó. Khi máy tính xử lý số thực, chúng tôi gọi chúng là số dấu phẩy động . Tên này bắt nguồn từ một tiêu chuẩn để biểu diễn các số, trong đó phần nguyên và phần phân số của một số được phân tách bằng dấu chấm (dấu chấm, không phải dấu phẩy).

Một số thông tin hữu ích:

Mỗi quốc gia có tiêu chuẩn viết số riêng (ngạc nhiên chưa!).

Nhiều người đã quen với việc sử dụng dấu chấm để phân tách hàng nghìn và dấu phẩy làm dấu tách thập phân: ví dụ: họ sẽ viết one million ones and 153 thousandths1.000.000,153. Nhưng ở Hoa Kỳ, nơi những người tạo ra Java sinh sống, một tiêu chuẩn khác đã được áp dụng:1000000.153

Java có hai kiểu nguyên thủy dấu chấm động: doublefloat.

Như chúng tôi đã nói trước đó, các loại này có một sự sắp xếp bên trong rất cụ thể: trên thực tế, bên trong mỗi biến của các loại này không phải là một số mà là hai số:

Ví dụ: số dấu phẩy động 987654.321có thể được biểu diễn dưới dạng . Sau đó, trong bộ nhớ, nó sẽ được biểu diễn dưới dạng hai số ( phần định trị , tức là phần có nghĩa của số) và ( số mũ , tức là lũy thừa của mười)0.987654321*1069876543216

floatkiểu

Tên của floatloại xuất phát từ số dấu phẩy động . Kích thước của loại này khá nhỏ — chỉ 4 byte (32 bit) — nhưng nó có thể lưu trữ các giá trị từ đến . 24 bit được phân bổ để biểu diễn phần định trị và 8 bit cho số mũ. Loại này chỉ có khả năng lưu trữ 8 chữ số có nghĩa.-3.4*10383.4*1038

Cách tiếp cận này cho phép lưu trữ các số lớn hơn nhiều so với một int, trong khi sử dụng cùng 4 byte. Nhưng để làm như vậy, chúng tôi hy sinh độ chính xác. Bởi vì một phần của bộ nhớ lưu phần định trị, các biến này chỉ lưu 6-7 chữ số thập phân trong khi phần còn lại bị loại bỏ.

Ví dụ:

Mã số Giá trị
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

Như bạn có thể thấy, nhược điểm chính của loại này là số lượng chữ số có nghĩa rất nhỏ và mất độ chính xác ngay sau chữ số thứ tám. Đó là lý do tại sao floatloại này không phổ biến lắm đối với các lập trình viên Java.

doublekiểu

Loại doublelà loại dấu phẩy động tiêu chuẩn. Tên xuất phát từ số dấu phẩy động chính xác kép . Tất cả các chữ thực là doubles theo mặc định.

Loại này chiếm 8 byte bộ nhớ (64 bit) và có thể lưu trữ các giá trị từ đến . Một điều quan trọng cần biết là 53 bit được phân bổ cho phần định trị, trong khi 11 bit còn lại dành cho số mũ.-1.7*103081.7*10308

Điều này cho phép lưu trữ 15-17 chữ số có nghĩa.

Ví dụ:

Mã số Giá trị
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Độ chính xác này, đặc biệt là khi so sánh với floatloại, mang tính quyết định: 99% tất cả các thao tác với số thực được thực hiện bằng cách sử dụng doubleloại.

11bit được phân bổ cho số mũ, có nghĩa là bạn có thể lưu trữ lũy thừa mười từ -323đến +308(đó là lũy thừa hai từ -1024đến +1023). Loại doublecó thể dễ dàng lưu trữ một số có hàng trăm số 0 sau dấu thập phân:

Mã số Giá trị
double a = 2E-300 * 3E+302
600.0


4. Vô cực

Các số dấu phẩy động có một tính năng thú vị khác: chúng có thể lưu trữ một giá trị đặc biệt biểu thị vô cùng . Và bạn có thể đại diện cho vô cực dươngvô cực âm .

Ví dụ:

Mã số Ghi chú
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

Nếu vô cực được nhân với một số, bạn sẽ có được vô cùng. Nếu bạn thêm một số vào vô cực, bạn sẽ có vô cùng. Đó là siêu thuận tiện.

Không phải là số ( NaN)

Bất kỳ hoạt động liên quan đến năng suất vô cực vô cùng. Vâng, hầu hết nhưng không phải tất cả.

Các số dấu phẩy động có thể lưu trữ một giá trị đặc biệt khác: NaN. Nó là viết tắt của N ot a N umber (không phải là số).

Trong toán học, nếu bạn chia vô cực cho vô cực, kết quả là không xác định.

Nhưng, trong Java, nếu bạn chia vô cực cho vô cực, kết quả là NaN.

Ví dụ:

Mã số Ghi chú
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

Bất kỳ hoạt động nào có NaNlợi nhuận NaN.



5. charloại

Trong số các kiểu nguyên thủy của Javachar , một kiểu đáng được chú ý đặc biệt: kiểu. Tên của nó xuất phát từ từ char acter và bản thân loại được sử dụng để lưu trữ các ký tự.

Ký tự là những gì các chuỗi được làm bằng, phải không? Chuỗi là một mảng các ký tự.

Nhưng điều thú vị hơn nữa là charloại này cũng là một loại số ! Đó là một loại mục đích kép, có thể nói như vậy.

Thực tế là charloại không thực sự ký tự. Thay vào đó, nó lưu trữ mã ký tự từ bảng mã Unicode. Mỗi ký tự tương ứng với một số: mã số của ký tự.

Mỗi charbiến chiếm hai byte trong bộ nhớ (giống như kiểu short). Nhưng không giống như shortkiểu, charkiểu số nguyên không dấu và có thể lưu trữ các giá trị từ 0đến 65,535.

Loại này charlà loại lai. Các giá trị của nó có thể được diễn giải dưới dạng số (ví dụ: chúng có thể được cộng và nhân) và dưới dạng ký tự. Điều này được thực hiện bởi vì mặc dù các ký tự là các biểu diễn trực quan, nhưng đối với máy tính, trên hết chúng chỉ là các con số. Và sẽ thuận tiện hơn nhiều khi làm việc với chúng dưới dạng số.

bảng chữ cái

Unicode là một bảng đặc biệt (mã hóa) chứa tất cả các ký tự trên thế giới. Và mỗi nhân vật có số riêng của mình. Nó trông gần như thế này:

Các kiểu nguyên thủy trong Java

Có nhiều cách khác nhau để gán một giá trị cho một charbiến.

Mã số Sự miêu tả
char a = 'A';
Biến asẽ chứa chữ cái Latinh A.
char a = 65;
Biến asẽ chứa chữ cái Latinh A. Mã của nó là 65.
char a = 0x41;
Biến asẽ chứa chữ cái Latinh A.
Mã của nó là 65, bằng 41trong hệ thập lục phân.
char a = 0x0041;
Biến asẽ chứa chữ cái Latinh A.
Mã của nó là 65, bằng 41trong hệ thập lục phân.
Hai số không phụ không thay đổi bất cứ điều gì.
char a = '\u0041';
Biến asẽ chứa chữ cái Latinh A.
Một cách khác để xác định một ký tự bằng mã của nó.

Thông thường, mọi người chỉ cần chỉ ra ký tự trong dấu ngoặc kép (như ở hàng đầu tiên của bảng). Điều đó nói rằng, phương pháp thứ hai cũng phổ biến. Ưu điểm của nó là nó có thể được sử dụng trong chuỗi.

Và như chúng tôi đã nói, charkiểu này cũng là kiểu số nguyên, vì vậy bạn có thể viết như sau:

Mã số Đầu ra bảng điều khiển
char a = 'A';
a++;
System.out.println(a);
Chữ Latinh Bsẽ được hiển thị trên màn hình.
Vì:
A65
B66
C67

làm việc với chars

Mỗi cái chartrước hết là một số (mã ký tự), sau đó là một ký tự. Nếu bạn biết mã ký tự, bạn luôn có thể lấy ký tự đó trong chương trình của mình. Ví dụ:

Mã số Đầu ra bảng điều khiển
char c = (char) 1128;
System.out.println(c);

Ѩ

mã tiêu chuẩn

Dưới đây là các mã ký tự nổi tiếng nhất:

Nhân vật
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. booleanloại

Và kiểu nguyên thủy cuối cùng là boolean.

Như bạn đã biết, nó chỉ có thể nhận hai giá trị: truefalse.

Và với điều đó, bạn đã biết mọi thứ cần biết về loại hình này.