Lớp Wrapper trong Java

Lớp Wrapper thực chất chỉ là một cái tên chung cho rất nhiều lớp khác nhau. Vì tất cả các lớp thuộc bài hôm nay có cùng một công năng, nên mới gọi chung một cái tên Wrapper như vậy. Cùng eLib.VN tìm hiểu về lớp Wrapper qua bài viết dưới đây.

Lớp Wrapper trong Java

1. Lớp Wrapper là gì

Lớp Wrapper trong Java cung cấp kỹ thuật để chuyển đổi kiểu gốc primitive thành đối tượng và từ đối tượng thành kiểu gốc. Từ J2SE 5.0, đặc điểm autoboxing và unboxing sẽ tự động chuyển đổi primitive thành object (là autoboxing) và từ object thành primitive (là unboxing). Một trong 8 lớp của java.lang package là lớp Wrapper trong Java. Bảng dưới đây liệt kê danh sách 8 lớp Wrapper:

Kiểu gốc Lớp Wrapper
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

2. Chuyển kiểu dữ liệu nguyên thủy thành kiểu Wrapper

Việc chuyển đổi một kiểu nguyên thủy sang kiểu Wrapper của nó người ta gọi là Boxing. Không phải mang ý nghĩa là môn đấm bốc đâu. Boxing ở đây mang ý nghĩa là đóng hộp, tức là đóng dữ liệu nguyên thủy vào trong cái hộp Wrapper của nó đấy. Như ví dụ mà bạn xem trên kia, khi một kiểu int a được chuyển thành kiểu Integer i.

Bạn có thể thực hiện việc boxing thông qua các phương thức khởi tạo của các lớp Wrapper.

public class WrapperExample1 {
  public static void main(String args[]) {
    // Đổi int thành Integer
    int a = 20;
    Integer i = Integer.valueOf(a); // đổi int thành Integer
    Integer j = a; // autoboxing, tự động đổi int thành Integer trong nội bộ trình biên dịch

    System.out.println(a + " " + i + " " + j);
  }
}

Output:

20 20 20

3. Chuyển kiểu Wrapper thành kiểu dữ liểu nguyên thủy

Ngược lại với trên kia, khi bạn chuyển từ một kiểu Wrapper sang kiểu nguyên thủy của nó người ta gọi là Unboxing, có nghĩa là mở hộp, tức là mở cái hộp Wrapper để lấy dữ liệu nguyên thủy ra.

public class WrapperExample2 {
  public static void main(String args[]) {
    // đổi Integer thành int
    Integer a = new Integer(3);
    int i = a.intValue(); // đổi Integer thành int
    int j = a; // unboxing, tự động đổi Integer thành int trong nội bộ trình biên dịch

    System.out.println(a + " " + i + " " + j);
  }
}

Output:

3 3 3

4. Các phương thức hữu ích của lớp Wrapper

Như trên kia mình có nói là các lớp Wrapper giúp tạo thêm cho các kiểu dữ liệu nguyên thủy vốn chỉ có tác dụng chứa đựng dữ liệu, trở thành một đối tượng với nhiều phương thức hữu dụng hơn. Sau đây mình sẽ liệt kê các phương thức hữu dụng của chúng để bạn tham khảo nhé.

parseXxx()

Tham số truyền vào cho phương thức static này là một chuỗi, kết quả nhận được là một giá trị nguyên thủy tương ứng với chuỗi truyền vào.

int i = Integer.parseInt("10");
float f = Float.parseFloat("4.5");
boolean b = Boolean.parseBoolean("true");

System.out.println(i);
System.out.println(f);
System.out.println(b);

Chắc bạn cũng đoán được kết quả in ra console của dòng code trên đây rồi đúng không nào.

toString()

Khác với toString() của lớp Object, toString() lần này của các lớp Wrapper là phương thức static, nó có một giá trị truyền vào là kiểu dữ liệu nguyên thủy tương ứng với lớp Wrapper đó, và kết quả trả về là một chuỗi tương ứng với giá trị truyền vào. Ví dụ này thử nghiệm với lớp Integer, các lớp Wrapper khác cũng sẽ tương tự.

String sI = Integer.toString(10);
System.out.println(sI);

Kết quả in ra console là chuỗi “10”.

xxxValue()

Bạn đã làm quen với phương thức này ở trên kia. Cụ thể thì các phương thức dạng này giúp chuyển đổi một giá trị của lớp Wrapper nào đó về kiểu dữ liệu nguyên thủy (unboxing). Thỉnh thoảng phương thức này còn giúp chuyển đổi kiểu dữ liệu như khi bạn ép kiểu tường minh một giá trị vậy. Bạn có thể dễ hiểu hơn khi xem ví dụ sau.

Double d = 50.5;
int i = d.intValue();
byte b = d.byteValue();

System.out.println(d);
System.out.println(i);
System.out.println(b);

Kết quả in ra console lần lượt là 50.5, 50 và 50.

compareTo()

Nếu bạn còn nhớ, ở bài học về chuỗi chúng ta cũng đã nói qua phương thức compareTo() dùng để so sánh các giá trị chuỗi với nhau. Vậy thì đối với các lớp Wrapper mà chúng ta làm quen hôm nay, thì công năng của nó vẫn được áp dụng trọn vẹn. Tức là phương thức này sẽ được dùng để so sánh hai giá trị của hai lớp Wrapper (có cùng kiểu dữ liệu) với nhau.

Cụ thể, với việc bạn gọi lopWrapper1.compareTo(lopWrapper2), thì kết quả sẽ như sau.

– Nếu kết quả của phương thức trả về một số âm, thì lopWrapper1 sẽ có giá trị nhỏ hơn lopWrapper2.
– Nếu kết quả của phương thức trả về số 0, thì lopWrapper1 sẽ có giá trị bằng với lopWrapper2.
– Nếu kết quả của phương thức trả về một số dương, thì lopWrapper1 sẽ có giá trị lớn hơn lopWrapper2.Bạn có thể xem ví dụ sau để hiểu rõ hơn.

nteger i = 50;
Integer i1 = Integer.parseInt("50");
Integer i2 = Integer.valueOf(52);
Integer i3 = 30;

System.out.println("CompareTo i & i1: " + i.compareTo(i1));
System.out.println("CompareTo i & i2: " + i.compareTo(i2));
System.out.println("CompareTo i & i3: " + i.compareTo(i3));

Kết quả in ra console sẽ là.

CompareTo i & i1: 0
CompareTo i & i2: -1
CompareTo i & i3: 1
compare()

Phương thức này có công dụng và cách sử dụng giống giống với compareTo() trên kia. Khác ở chỗ đây là phương thức static của mỗi lớp Wrapper, nên bạn có thể gọi trực tiếp từ lớp. Đồng thời tham số truyền vào là hai giá trị của hai lớp Wrapper. Kết quả trả về của compare() cũng mang một trong ba giá trị (âm, 0, dương) như với compareTo() trên đây.

Integer i1 = Integer.parseInt("50");
Integer i2 = Integer.valueOf(52);
         
System.out.println("Compare i1 & i2: " + Integer.compare(i1, i2));
         
Float f1 = new Float("20.25f");
Float f2 = new Float("2.43f");
         
System.out.println("Compare f1 & f2: " + Float.compare(f1,f2));

Kết quả in ra console là.

Compare i1 & i2: -1
Compare f1 & f2: 1

equals()

Tương tự như equals() khi so sánh chuỗi. Phương thức này sẽ so sánh các giá trị của các lớp Wrapper và trả về một kiểu boollean, với true là bằng nhau và false là khác nhau. Như ví dụ sau.

Integer i1 = Integer.parseInt("50");
Integer i2 = Integer.valueOf(50);

System.out.println("Compare i1 & i2: " + i1.equals(i2));

Float f1 = new Float("20.25f");
Float f2 = new Float("2.43f");

System.out.println("Compare f1 & f2: " + f1.equals(f2));

Kết quả in ra console là.

Compare i1 & i2: true
Compare f1 & f2: false

Trên đây là bài viết của eLib.VN về lớp Wrapper trong Java. Hy vọng, sau khi đọc xong bài viết này, bạn đọc có thể áp dụng lớp wrapper để tối ưu dữ liệu, làm cho chúng trở nên đa dạng và tiện dụng hơn. Chúc các bạn thành công!

Ngày:30/09/2020 Chia sẻ bởi:Denni Trần

CÓ THỂ BẠN QUAN TÂM