Lớp Wrapper và kiểu nguyên thủy

Danh sách lớp Wrapper tương ứng với kiểu dữ liệu nguyên thủy

Kiểu gốcLớp Wrapper
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
Bảng này ở đâu cũng có, mình đi cop không biết có cần nghi nguồn ko nhỉ

Lớp Wrapper cho phép chuyển các giá trị nguyên thủy thành kiểu tham chiếu, từ đó các giá trị có thể nhận giá trị null và dễ dàng thao tác hơn.

Java Compiler có 2 cơ chế chuyển đổi giữa 2 dạng này.

  • Cơ chế autoboxing là cơ chế chuyển đổi kiểu dữ liệu nguyên thủy sang Wrapper tương ứng:
Integer a = 1;
số 1 là kiểu số nguyên int được chuyển thành một đối tượng Wrapper Integer tương ứng.
  • Cơ chế unboxing là cơ chế chuyển đổi đối tượng thuộc lớp Wrapper sang kiểu dữ liệu nguyên thủy.
Integer a = 5;
int c = a;
biến a là kiểu thuộc lớp Wrapper, khi được gán với biến c nó tự động được unboxing thành kiểu nguyên thủy int.

Vì 2 cơ chế này ta hoàn toàn so sánh được 2 giá trị thuộc 2 kiểu nguyên thủy và wrapper tương ứng khi chúng có giá trị bằng nhau.

Nó vẫn đúng kể cả với trường hợp sau:

    int x = 1;
    Integer a = new Integer(1);
    System.out.println("x == a: " + (x == a));

Tuy nhiên, khi bạn thực hiện tạo ra 2 đối tượng thuộc lớp Wrapper như sau:

        Integer a = new Integer(5);
        Integer b = new Integer(5);
        System.out.println(a==b);

Phép so sánh trên sẽ trả về false vì biến a và b lưu giá trị ô nhớ của 2 vùng nhớ khác nhau trên Heap.

Trong trường hợp này bạn có thể sử dụng a.equals(b) để so sánh giá trị

Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a.equals(b));

tuy nhiên kiểu dữ liệu Wrapper cũng có một số đặc biệt như sau:

 Integer a = 1;
 Integer b = 1;
 Integer c = 128;

Integer d = 128;
// dòng lệnh sau cho kết quả true
System.out.println("a == b: " + (a == b));
// dòng lệnh sau cho kết quả false
System.out.println("c == d: " + (c == d));

Trường hợp của những số nguyên không nằm trong khoảng từ -128 đến 127 sẽ đều nhận kết quả false. Có thể giải thích như sau. JVM có một vùng nhớ trong Heap cho số nguyên (được gọi là caches) để lưu các giá trị được autoboxing từ wrapper. Đối với kiểu Integer thì caches sẽ lưu các giá trị trong khoảng từ “-128” đến “+127”. Vì vậy với những số không nằm trong khoảng đó nó ko thể autoboxing được nên kết quả của phép so sánh trả về false.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *