Các Kiểu Dữ Liệu Trong Java

Các Kiểu Dữ Liệu Trong Java

Kiểu dữ liệu trong Java dùng để xác định kích thước và loại giá trị có thể được lưu trữ trong một định danh (Định danh ở đây bao gồm tên biến, phương thức, tên lớp, Interface và tên Package). Các kiểu dữ liệu khác nhau cho phép chúng ta lựa chọn kiểu phù hợp với yêu cầu của bài toán đặt ra.

Trong Java có 2 kiểu dữ liệu thường gặp đó là: Primitive data (kiểu dữ liệu cơ sở) và Reference Types (object)

1. Kiểu dữ liệu nguyên thủy

Kiểu dữ liệu cơ sở là kiểu dữ liệu đơn giản nhất trong Java. Tại một thời điểm, một kiểu dữ liệu cơ sở chỉ lưu trữ một giá trị đơn, không có các thông tin khác

Kiểu dữ liệu Mô tả
byte Dùng để lưu dữ liệu kiểu số nguyên có kích thước một byte (8 bít). Phạm vi biểu diễn giá trị từ -128 đến 127. Giá trị mặc định là 0.
char Dùng để lưu dữ liệu kiểu kí tự hoặc số nguyên không âm có kích thước 2 byte (16 bít). Phạm vi biểu diễn giá trị từ 0 đến u\ffff. Giá trị mặc định là 0.
boolean Dùng để lưu dữ liệu chỉ có hai trạng thái đúng hoặc sai (độ lớn chỉ có 1 bít). Phạm vi biểu diễn giá trị là {“True”, “False”}. Giá trị mặc định là False.
short Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 2 byte (16 bít). Phạm vi biểu diễn giá trị từ - 32768 đến 32767. Giá trị mặc định là 0.
int Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 4 byte (32 bít). Phạm vi biểu diễn giá trị từ -2,147,483,648 đến 2,147,483,647. Giá trị mặc định là 0.
long Dùng để lưu dữ liệu có kiểu số nguyên có kích thước lên đến 8 byte. Giá trị mặc định là 0L.
float Dùng để lưu dữ liệu có kiểu số thực, kích cỡ 4 byte (32 bít). Giá trị mặc định là 0.0F.
double Dùng để lưu dữ liệu có kiểu số thực có kích thước lên đến 8 byte. Giá trị mặc định là 0.00D

Ví dụ:

  • byte b = 1;
  • short s = 16;
  • int i = 32;
  • long lg = 3123456789L;
  • float f = 3.14F;
  • double d = 3.24;
  • boolean bool = true;

Lưu ý:

  • Khi khai báo kiểu float các bạn nhớ thêm chữ F (viết hoa hoặc viết thường đều được vào cuối giá trị của biến nhé. Đây là quy định của Java để nó biết rằng đây là giá trị của biến là kiểu float. Tương tự là chữ L cho kiểu long.
  • Mặc định Java xem các kiểu số nguyên là int và kiểu số có phần thập phân là double.
  • Một dạng biểu diễn khác, chúng ta cũng có thể gặp trong chương trình Java là số kết hợp với dấu gạch dưới (_), mục đích của cách viết này để cho dễ đọc. Ví dụ:

    • int million1 = 1000000;
    • int million2 = 1_000_000;
  • Lưu ý: có thể thêm dấu gạch dưới ở bất kỳ đâu ngoại trừ ở đầu một chữ, cuối một chữ, ngay trước dấu thập phân hoặc ngay sau dấu thập phân. Ví dụ:

    • double notAtStart = _1000.00; // DOES NOT COMPILE
    • double notAtEnd = 1000.00_; // DOES NOT COMPILE
    • double notByDecimal = 1000_.00; // DOES NOT COMPILE
    • double annoyingButLegal = 1_00_0.0_0; // Ugly, but compiles
    • double reallyUgly = 1__________2; // Also compiles

Overflow và underflow:

Overflow (Tràn) là khi một số lớn đến mức nó sẽ không còn vừa với kiểu dữ liệu nữa, do đó hệ thống chuyển về giá trị âm thấp nhất và đếm lên từ đó. Ngoài ra còn có một quy trình tương tự (Underflow), khi số lượng quá thấp để phù hợp với loại dữ liệu, hệ thống sẽ chuyển về giá trị cao nhất và giảm xuống từ đó.

Ví dụ: 

  • Overflow:
    • System.out.println(2147483647 + 1); // -2147483648
    • System.out.println(2147483647 + 5); // -2147483644
  • Underflow:
    • System.out.println(-2147483648 – 1); // 2147483647
    • System.out.println(-2147483648 – 5); // 2147483643

2. Reference Types

Kiểu dữ liệu tham chiếu là kiểu dữ liệu của đối tượng. Biến của kiểu dữ liệu tham chiếu chỉ chứa địa chỉ của đối tượng dữ liệu tại bộ nhớ Stack. Đối tượng dữ liệu lại nằm ở bộ nhớ Heap. Một số kiểu dữ liệu cụ thể như các mảng (Array), lớp đối tượng (Class) hay kiểu lớp giao tiếp (Interface).

Kiểu dữ liệuMô tả
ArrayMột mảng của các dữ liệu cùng kiểu.
classDữ liệu kiểu lớp đối tượng do người dùng định nghĩa. Chứa tập các thuộc tính và phương thức..
interfaceDữ liệu kiểu lớp giao tiếp do người dùng định nghĩa. Chứa các phương thức của giao tiếp

3. Lớp Wrapper trong Java

3.1 Giới thiệu lớp Wrapper

Lớp Wrapper trong java là biểu diễn Đối tượng của tám kiểu nguyên thủy trong java. Tất cả các lớp wrapper trong java là bất biến và final.

Lớp Wrapper trong java cung cấp cơ chế để chuyển đổi kiểu dữ liệu nguyên thủy thành kiểu đối tượng và ngược lại từ đối tượng thành kiểu dữ liệu nguyên thủy.

Bảng dưới đây hiển thị các kiểu nguyên thủy và lớp trình bao bọc của chúng trong java.

Primitive typeWrapper classConstructor Arguments
byteBytebyte or String
shortShortshort or String
intIntegerint or String
longLonglong or String
floatFloatfloat, double or String
doubleDoubledouble or String
charCharacterchar
booleanBooleanboolean or String

3.2 Tại sao chúng ta cần các lớp wrapper?

Trước tiên, điều cơ bản nhất cho chuyện này là, các lớp Wrapper sẽ giúp chúng ta chuyển đổi qua lại giữa một kiểu dữ liệu nguyên thủy sang kiểu dữ liệu đối tượng và ngược lại.

Bạn có thể xem ví dụ cho việc sử dụng kiểu dữ liệu nguyên thủy và kiểu Wrapper của nó như sau.

 
				
					int a = 20; // a là biến có kiểu dữ liệu int nguyên thủy
Integer i = Integer.valueOf(a); // i là biến có kiểu dữ liệu đối tượng Integer, được t
				
			

Bạn có thể thấy, biến a là kiểu int, còn biến i là kiểu Integer.

Ý tiếp theo cho câu hỏi tại sao này là, nếu với các kiểu dữ liệu nguyên thủy, bạn chỉ có một chọn lựa là tạo ra biến rồi sử dụng giá trị của nó (nếu bạn không gán giá trị thì nó vẫn được tạo một giá trị mặc định, bạn có thể xem lại ở bài các kiểu dữ liệu nguyên thủy). Còn với các kiểu đối tượng, giá trị mặc định của nó là null, giá trị null này có thể được tận dụng trong một số trường hợp, như mang ý nghĩa chưa có giá trị chẳng hạn. Ngoài ra, các kiểu đối tượng còn mang theo nó nhiều phương thức hữu dụng, làm phong phú hơn tính ứng dụng của kiểu dữ liệu.

Thêm nữa, một số cấu trúc khác bên trong ngôn ngữ Java, như các cấu trúc về các danh sách mà chúng ta sẽ làm quen sau như ArrayList hay Vector đều chứa đựng các tập hợp kiểu dữ liệu đối tượng thay vì kiểu nguyên thủy, nên việc biết và vận dụng các lớp Wrapper là một bắt buộc.