Trong Java, kiểu dữ liệu được chia làm hai loại: kiểu dữ liệu nguyên thủy (primitive) và kiểu đối tượng (object). Thông thường, để phân biệt 2 kiểu này ta dựa vào tên của nó. Kiểu nguyên thủy có tên bắt đầu bằng chữ thường, các kiểu đối tượng có tên bắt đầu bằng chữ hoa. Ví dụ: int, double là kiểu nguyên thủy, Integer, Double là kiểu đối tượng.
1. Kiểu dữ liệu nguyên thủy
Có 8 loại dữ liệu nguyên thủy (primitive data) trong JAVA:
- Kiểu số nguyên: byte, short, int, long
- Kiểu số thực: float, double
- Kiểu ký tự: char
- Kiểu logic: trả về giá trị true hoặc false (đúng hoặc sai).

| Kiểu dữ liệu | Số bit | Giá trị nhỏ nhất | Giá trị lớn nhất |
| byte | 8 | -128 (-2^7) | 127 (2^7-1) |
| short | 16 | -32,768 (-2^15) | 32,767 (2^15 -1) |
| int | 32 | – 2,147,483,648 (-2^31) | 2,147,483,647 (2^31 -1) |
| long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 -1) |
| float | 32 | -3.4028235 x 10^38 | 3.4028235 x 10^38 |
| double | 64 | -1.7976931348623157 x 10^308 | 1.7976931348623157 x 10^308 |
| boolean | false | true | |
| char | 16 | ‘\u0000’ (0) | ‘\uffff’ (65,535). |
2. Kiểu dữ liệu đối tượng
Trong java có 3 kiểu dữ liệu đối tượng:
| KIỂU DỮ LIỆU | MÔ TẢ |
|---|---|
| Array | Một mảng của các dữ liệu cùng kiểu. |
| class | Dữ 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.. |
| interface | Dữ 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 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.
| Kiểu nguyên thủy | Kiểu Wrapper |
| boolean | Boolean |
| char | Character |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
Ví dụ:
int num1 = 1; Integer num2 = Integer.valueOf(num1);// đổi int thành Integer Integer num3 = num1;// autoboxing, tự động đổi int thành Integer trong nội bộ trình biên dịch int num4 = num2.intValue();// đổi Integer thành int int num5 = num3;// unboxing, tự động đổi Integer thành int trong nội bộ trình biên dịch
3.2. Tại sao cần Wrapper class
- Có thể sử dụng lớp Wrapper trong Collection.
- Cần sử dụng các biến có giá trị Null.
- Với wrapper chúng ta có thể nhận được NullPointerException khi một cái gì đó đang được thiết lập không chính xác. Đôi khi nó giúp chúng ta dễ dàng phát hiện lỗi hơn.
- Với kiểu dữ liệu nguyên thủy, các giá trị có thể được khởi tạo với giá trị mặc định 0, false, … điều này có thể không chính xác hoặc gây nhầm lẫn cho lập trình viên.
3.3. Hạn chế của Wrapper class
- Các kiểu dữ liệu nguyên thủy có thể nhanh hơn nhiều so với các lớp Wrapper tương ứng.
- Phép toán so sánh == có thể cho kết quả không như mong đợi.
- == so sánh tham chiếu (reference)
- .equal() so sánh các giá trị (value)
3. 4. So sánh hiệu suất (performance) giữa kiểu dữ liệu nguyên thủy (primitive type) hay Wrapper Class
package com.maixuanviet;
import java.util.ArrayList;
import java.util.List;
public class AutoBoxingPerformanceTest {
public static void main(String args[]) {
long time1 = 0;
long time2 = 0;
List<Integer> listValues = new ArrayList<>();
int arrValues[] = new int[1000000];
// Inserting values into List and Array
for (int i = 0; i < 1000000; i++) {
listValues.add(i);
arrValues[i] = i;
}
// Reterive the values from collection objects and do the multiplication
time1 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
listValues.set(i, listValues.get(i) * 10);
}
time2 = System.currentTimeMillis();
System.out.println(&quot;AutoBoxing with Collection : &quot; + (time2 - time1) + &quot;ms&quot;);
// Reterive the values from arrays and do the multiplication
time1 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
arrValues[i] = arrValues[i] * 10;
}
time2 = System.currentTimeMillis();
System.out.println(&quot;Using an Array : &quot; + (time2 - time1) + &quot;ms&quot;);
}
}
Kết quả thực thi chương trình trên:
AutoBoxing with Collection : 23ms Using an Array : 8ms
3.5. Nên lựa chọn kiểu dữ liệu nguyên thủy (primitive type) hay Wrapper Class
- Nói chung, bạn nên sử dụng các kiểu nguyên thủy trừ khi bạn cần một đối tượng vì một số lý do (ví dụ sử dụng trong Collection, có thể lưu giá trị Null).
- Có một số cấu trúc nhất định như Collection bắt buộc phải sử dụng đổi tượng lớp Wrapper. Lưu ý, các đối tượng tốn nhiều chi phí hơn so với các dữ liệu kiểu nguyên thủy của chúng.
- Nếu bạn vẫn cần wrapper, hãy xem xét một cách tiếp cận khác mà không yêu cầu đối tượng nếu bạn muốn tối đa hóa hiệu suất dữ liệu.
- Chúng ta cũng phải xem xét rằng autoboxing của lớp wrapper không làm giảm việc tạo object, nhưng nó làm giảm sự phức tạp của code.
Related posts:
Java Program to Implement SimpeBindings API
A Guide to HashSet in Java
Tính đa hình (Polymorphism) trong Java
Base64 encoding và decoding trong Java 8
Java Program to Find Basis and Dimension of a Matrix
Send an email with an attachment
Hướng dẫn Java Design Pattern – Iterator
Java Program to Perform Searching in a 2-Dimension K-D Tree
Java Program to Find Median of Elements where Elements are Stored in 2 Different Arrays
Java Program to Generate Random Numbers Using Middle Square Method
Java Program to Find Location of a Point Placed in Three Dimensions Using K-D Trees
Hướng dẫn sử dụng biểu thức chính quy (Regular Expression) trong Java
Guide to the Synchronized Keyword in Java
How to Store Duplicate Keys in a Map in Java?
A Comparison Between Spring and Spring Boot
Xây dựng ứng dụng Client-Server với Socket trong Java
Spring Webflux with Kotlin
Adding a Newline Character to a String in Java
Guide to the Java Clock Class
Reactive Flow with MongoDB, Kotlin, and Spring WebFlux
Extra Login Fields with Spring Security
What is Thread-Safety and How to Achieve it?
Java Program to Compute the Area of a Triangle Using Determinants
Java Program to Create the Prufer Code for a Tree
Java Program to Implement Nth Root Algorithm
JWT – Token-based Authentication trong Jersey 2.x
Overflow and Underflow in Java
Java Program to Implement Bresenham Line Algorithm
New Features in Java 14
Java Program to Find the Peak Element of an Array O(n) time (Naive Method)
Java Program to Generate Random Numbers Using Multiply with Carry Method
Zipping Collections in Java