Chúng ta đã được biết về các kiểu dữ liệu nguyên thuỷ trong java như int, long, float etc. Các kiểu dữ liệu nguyên thuỷ này không có tác dụng gì ngoài lưu trữ các giá trị, nếu chúng ta muốn chuyện một số int sang String, hoặc là khởi tại một số nguyên bởi một chuỗi số thì điều này là không thể.
Vì thế java đã cung cấp cho chúng ta Wrapper class tương ứng với từng kiểu dữ liệu. Các Wrapper class này chứa các kiểu tương ứng đồng thời cung cấp cho chúng ta vô số method hữu ích.
Tại sao cần Wrapper class
1, Các class trong java.util.package chỉ xử lý cho các object vì thế wrapper class giúp chúng ta chung trường hợp này.
Ví dụ chúng ta muốn có một ArrayList số nguyên và chúng ta khai báo như sau
List<int> list = new ArrayList<>();
Chúng ta sẽ bị compile error. Và chúng ta sẽ phải sử dụng Wrapper class của int là Integer.
List<Integer> list = new ArrayList<>();
2, Sử dụng giá trị null để đánh dấu rằng biến chưa mang giá trị nào. Sẽ có trường hợp bạn khai báo một biến số nguyên và chưa có giá trị cho đến khi trải qua một đoạn code xử lý nào đó!
Ngày xưa để giải quyết vấn đề này thì mình thường gán cho nó -1, 0 etc. Nhưng các cách này đều không hoàn hảo. Không sao, giờ đây chúng ta có thể thay thế chúng bằng Wrapper.
Ví dụ nếu bạn khai báo như sau
int t = null; System.out.println(t);
Thì chúng ta sẽ bị lỗi Error:(8, 17) java: incompatible types: <nulltype> cannot be converted to int
Mà phải wrapper class như sau
Integer t = null; System.out.println(t);
Output null
Bằng cách này chúng ta có thể kiểm tra
if (t == null) { // ... }
để biết được rằng biến này chưa được gán giá trị.
3, Các Wrapper class cung cấp cho chúng ta nhiều method để thao tác với kiểu dữ liệu nguyên thuỷ tương ứng, ví dụ như chuyến số nguyên sang chuỗi, Khởi tạo một số nguyên từ một chuỗi số.
public class Main { public static void main(String[] args) { Integer integer = Integer.valueOf("121"); System.out.println(integer); System.out.println("Integer to String: " + integer.toString()); } }
Output:
121
Integer to String: 121
4, Hỗ trợ tự động chuyển đổi qua lại giữa kiểu dữ liệu nguyên thuỷ và Object khi sử dụng Wrapper class, trong java gọi là cơ chế Autoboxing và Unboxing.
Cơ chế Autoboxing
Autoboxing là cơ chế tự động chuyển đổi kiểu dữ liệu nguyên thuỷ sang object của Wrapper class tương ứng. Ví dụ nó sẽ tự động chuyển int sang Integer, char sang Character etc.
Ví dụ
import java.util.ArrayList; class Autoboxing { public static void main(String[] args) { char ch = 'a'; // Tu dong chuyen doi char sang Character khi su dung toan tu gan Character a = ch; System.out.println("Character: " + a); ArrayList<Integer> arrayList = new ArrayList<Integer>(); // Autoboxing vi ArrayList luu object Interger arrayList.add(25); System.out.println(arrayList); } }
Cơ chế Unboxing
Ngược lại với autoboxing, unboxing là cơ chế giúp chuyển đổi các object của Wrapper class sang kiểu dữ liệu nguyên thuỷ tương ứng. Ví dụ Long chuyển thành long, Integer thành int.
import java.util.ArrayList; class Unboxing { public static void main(String[] args) { Character ch = 'a'; // unboxing - Chuyen Character sang char char a = ch; System.out.println(a); ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(24); // Chuyen Integer sang int int num = arrayList.get(0); // printing the values from primitive data types System.out.println(num); } }
Output
a
24
Kết
Wrapper class cung cấp cho chúng ta nhiều cơ giúp thao tác nhanh gọn thế nhưng không phải lúc nào cũng sử dụng chúng. Vì Wrapper class sẽ phải khởi object và tốn bộ nhớ hơn. Chúng ta cần phân tích kỹ trước khi sử dụng.
Ví dụ như với vòng lặp for như thế này.
Integer i; for (i = 0; i < n; i++)
Biến i chỉ dùng để lưu biến đếm nên việc sử dụng wrapper class ở đây là không cần thiết.