[JAVA] Kiểu dữ liệu nguyên thủy và kiểu dữ liệu tham chiếu

19:54


Đối với những ai đã từng học qua về java chắc hẳn đều biết trong Java có rất nhiều kiểu dữ liệu như là char, int, long, float, Object, … Tuy nhiên tất cả những kiểu dữ liệu này đều có thể chia thành 2 kiểu  dữ liệu cơ bản nhất đó là: Kiểu dữ liệu nguyên thủy (primitive type) và kiểu dữ liệu tham chiếu (reference type). Trong bài viết này chúng ta sẽ đi tìm hiểu về đặc điểm và các lưu ý khi sử dụng 2 kiểu dữ liệu cơ bản này.



1. Đầu tiên chúng ta sẽ tìm hiểu xem kiểu dữ liệu nguyên thủy và kiểu dữ liệu tham chiếu gồm nhưng kiểu dữ liệu nào:


  • Kiểu dữ liệu nguyên thủy
Chắc hẳn các bạn cũng biết đến các kiểu dữ liệu cơ bản của hầu hết mọi ngôn ngữ lập trình như char, int, long, flloat, double, … Nhưng chắc cũng có bạn không biết rằng trong java tất cả các kiểu dữ liệu loại này đều là dữ liệu nguyên thủy. Cụ thể thì kiểu dữ liệu nguyên thủy bao gồm các loại dữ liệu sau:

    • boolean
    • int
    • char
    • long
    • byte
    • float
    • short
    • double
Dưới đây là sơ đồ các kiểu dữ liệu cơ bản:

  • Kiểu dữ liệu tham chiếu
Vì chỉ có 2 kiểu dữ liệu là nguyên thủy và tham chiếu nên đương nhiên là những kiểu dữ liệu còn lại đều là kiểu dữ liệu tham chiếu rồi.
Một số ví dụ như là: Object, List, Array, … và tất nhiên tất cả các class mà bạn tạo ra đều là kiểu dữ liệu tham chiếu.

2. Tiếp theo chúng ta sẽ phân tích đặc điểm của 2 kiểu dữ liệu cơ sở này:

Sự khác nhau cơ bản nhất của 2 kiểu dữ liệu cơ bản và nguyên thủy chính là cách thức mà chúng lưu trữ dữ liệu, bên cạnh đó các kiểu dữ liệu nguyên thủy đều không có các phương thức đi kèm, trong khi các kiểu dữ liệu tham chiếu đều các phương thức đi kèm ví dụ như ArrayList thì có add(), remove(), … Object thì có toString(), …

Cụ thể hơn, về cách lưu trữ dữ liệu:
  • Kiểu dữ liệu nguyên thủy lưu trữ dữ liệu trong chính bản thân nó.
  • Còn kiểu dữ liệu tham chiếu chỉ lưu trữ 1 giá trị là địa chỉ đến vùng nhớ mà nó tham chiếu đến. Các vùng nhớ này mới là nơi lưu trữ các thuộc tính của các đối tượng mà kiểu dữ liệu tham chiếu chỉ đến. (tương tự như khái niệm con trỏ trong C/C++ vậy)
Có vẻ khó hiểu nhỉ, để hiểu rõ hơn bạn có thể xem hình sau (chú ý đây chỉ là minh họa dễ hiểu, chỉ tương tự chứ không thật sự giống như cơ chế thật):
  • Kiểu dữ liệu nguyên thủy: 2 biến X và Y có giá trị thực là 1 và 2, các giá trị thực này được nằm trong các ô nhớ tương ứng chứa X và Y chứ không cần tham chiếu tới vị trí khác.


  • Kiểu dữ liệu tham chiếu: Obj có giá trị là @8 nghĩa là đối tượng mà Obj tham chiếu đến nằm ở ô nhớ thứ 8 trên bộ nhớ trong (RAM)

Đó là nói về lý thuyết còn trong quá trình lập trình thì các kiểu dữ liệu nguyên thủy và tham chiếu có khác biệt như thế nào? 
Để thấy được sự khác biệt này ta cùng xét 1 ví dụ đơn giản:

Ví dụ về Kiểu dữ liệu nguyên thủy:

public static void main(String[] args) {
        int x = 10;
        int y = x;
        System.out.println("Before assign");
        System.out.println("x = "+x);
        System.out.println("y = "+y);

        y = 8;        System.out.println("After assign");
        System.out.println("x = "+x);
        System.out.println("y = "+y);
    }
Và đây là kết quả:
Before assign
X = 10
y = 10
After assign
X = 10y = 8
Bạn sẽ thấy rằng sau khi gán y=8 thì chỉ có giá trị của y thay đổi còn giá trị của x không thay đổi

Ví dụ về kiểu dữ liệu tham chiếu
public class ReferenceTypeExample {
    int value = 10; 
}
public static void main(String[] args) {
    ReferenceTypeExample x = new ReferenceTypeExample();
    ReferenceTypeExample y = x;
 
    System.out.println("Before assign");
    System.out.println("x = "+x.value);
    System.out.println("y = "+y.value);
 
    y.value = 8;
    System.out.println("After assign");
    System.out.println("x = "+x.value);
    System.out.println("y = "+y.value);
}

Và đây là kết quả
Before assign
x = 10
y = 10
After assign
x = 8
y = 8
Bạn sẽ thấy rằng sau khi gán y.value=8 thì giá trị value của cả x và y đều thay đổi (trở thành 8). 
Đây chính là sự khác biệt giữa kiểu dữ liệu tham chiếu và kiểu dữ liệu nguyên thủy đó.

Giải thích cho sự khác biệt này, vì kiểu dữ liệu nguyên thủy chứa dữ liệu ở trong chính ô nhớ của nó nên khi thay đổi y thì chỉ giá trị trong ô nhớ của y thay đổi mà giá trị trong ô nhớ của x không thay đổi. Còn đối với kiểu dữ liệu tham chiếu thì sau phép gán y=x, thì cả y và x sẽ cùng tham chiếu tới 1 ô nhớ, điều này làm cho khi thay đổi giá trị y.value chính là làm thay đổi giá trị value ở tại cái ô nhớ mà cả x và y cùng tham chiếu tới, nên khi x truy cập vào giá trị value của vùng nhớ đó thì giá trị này đã bị thay đổi do pháp gán y.value = 8

Chính vì sự khác biệt trên nên khi sử dụng kiểu dữ liệu tham chiếu các bạn cần cân nhắc để tránh trường hợp bị cập nhật giá trị không cần thiết.

Thông qua bài viết này, chắc hẳn các bạn đã hiểu được sự khác nhau cơ bản các kiểu dữ liệu nguyên thủy và tham chiếu. 
Hẹn gặp lại các bạn trong các bài viết khác của mình.

You Might Also Like

0 nhận xét

Popular Posts

Like us on Facebook

Flickr Images

Subscribe