Autoboxing và Unboxing trong java

Autoboxing trong java

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 Integerchar sang Character etc.

Ví dụ

Character ch = 'a';

Ký tự ‘a’ đang là một char, khi thực hiện toán tử gán cho một Character class object thì trình biên dịch sẽ khởi tạo một Character object từ ‘a’ và gán lại cho object ch.

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);

Ở đoạn code trên chúng ta có một ArrayList kiểu Integer chứ không phải. Để li.add(i) được thì trình biên dịch đã phải khởi tạo một Integer object và add và ArrayList. Đoạn mã trên sẽ được trình biên dịch chuyển đổi thành.

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(Integer.valueOf(i));

Vậy quá trình chuyển từ int sang Ingeger class tương ứng gọi là cơ chế autoboxing trong java. Trình biên dịch sẽ tự động áp dụng cơ chế này khi kiểu dữ liệu nguyên thuỷ được sử dụng trong các trường hợp:

1, Làm tham số đầu vào cho một method mà đối số thực là wrapper class tương ứng.

Ví dụ

public class Main {

    public static void main(String[] args) {
        autoboxing(1); // 1
    }

    public static void autoboxing(Integer i) {
        System.out.println(i.toString());
    }
}

2, Gán cho một biến có kiểu dữ liệu là wrapper class tương ứng.

Character ch = 'a';

Unboxing trong java

Xem ví dụ sau đây

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

Nhắc lại: các phép tính (%, +=) chỉ áp dụng cho các kiểu dữ liệu nguyên thuỷ như int, long etc. Ở trên rõ là chúng ta đang loop qua các object integer vậy mà sumEven() vẫn hoạt động bình thường mà không có lỗi gì xảy ra. Đó là trình biên dịch java đã chuyển object integer sang int bằng cácg gọi method intValue() tại runtime đấy các bạn. Như vậy code cuối cùng của chúng ta sẽ trông như thế này

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i : li)
        if (i.intValue() % 2 == 0)
            sum += i.intValue();
        return sum;
}

Như vây quá trình chuyển một object integer sang int như trên được gọi là unboxing trong java. Unboxing được trình biên dịch java áp dụng khi:

1, Truyền object wrapper như một tham số vào method chỉ định kiểu dữ liệu nguyên thuỷ tương ứng. 

2, Gán một biến object wrapper class cho kiểu dữ liệu nguyên thuỷ tương ứng.

Ví dụ

import java.util.ArrayList;
import java.util.List;

public class Unboxing {

    public static void main(String[] args) {
        Integer i = new Integer(-8);

        // 1. Trường hợp 1
        int absVal = absoluteValue(i);
        System.out.println("absolute value of " + i + " = " + absVal);

        List<Double> ld = new ArrayList<>();
        ld.add(3.1416);    // autoboxing

        // 2. Trường hợp 2
        double pi = ld.get(0);
        System.out.println("pi = " + pi);
    }

    public static int absoluteValue(int i) {
        return (i < 0) ? -i : i;
    }
}

Danh sách các wrapper class và kiểu dữ liệu nguyên thuỷ tương ứng

Wrapper class Kiểu dữ liệu nguyên thuỷ
Boolean boolean
Integer int
Long long
Double double
Float float
Character char
Short shor
Byte byte
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x