🎰Data Type

Data Type trong Java được định nghĩa với vai trò phân bổ các kích thước size và loại giá trị được lưu trữ trong 1 biến hay 1 định danh (Method,...). Java có rất nhiều loại data type. Đây là 2 phần:

Tại sao Data Type là cần thiết? - Tối ưu vùng nhớ - Quản lí chương trình dễ dàng - Fix "bug" đơn giản hơn

Khi thực hiện việc gán giá trị, so sánh bằng toán tử ==, truyền tham số vào phương thức hay lấy dữ liệu trả về từ hàm thì giá trị của biến được truyền vào. - với biến là Primitive Type giá trị của nó chính là giá trị mà đã được truyền cho nó - với biến Reference Type, giá trị của nó là địa chỉ của một đối tượng nào đó, hoặc là null.

1. Primitive Type

Khi ta sao chép giá trị biến này cho biến khác thì giá trị của 2 biến này độc lập và không liên quan với nhau. Ví dụ:

int a = 1;
int b = a;
b = 2;
System.out.print(a); // 1
System.out.print(b); // 2

Dù gán b = a, nhưng khi b thay đổi thì a vẫn không thay đổi!

Khi giá trị thuộc kiểu dữ liệu nguyên thủy, biến sẽ chứa giá trị của biến đó.

Java có 8 kiểu dữ liệu nguyên thuỷ:

2. Reference Type

Khi gán hoặc sao chép dữ liệu thuộc kiểu object thì biến đó chỉ lưu địa chỉ của giá trị đó trên vùng nhớ. Nó không lưu giá trị được gán. Ví dụ:

Gán object

ví dụ với array :

let arr1 = ['a', 'b']
let arr2 = cars1
arr2 = ['c', 'd']
console.log(arr1) // ['a', 'b']
console.log(arr2) // ['c', 'd']

location1 đại diện cho địa chỉ vùng nhớ của array ['a','b']

location2 đại diện cho địa chỉ vùng nhớ của array ['c', 'd']

location1 khác location2

Nhìn vào sơ đồ trên ta thấy được ban đầu thì arr1 và arr2 đều lưu giá trị ô nhớ giống nhau (đều là location1) và chia sẻ cho nhau các thuộc tính bên trong array. arr1 và arr2 đều có giá trị ô nhớ giống nhau nhưng nó lại ở 2 mắt xích khác nhau, vì thế khi thay đổi arr2 bằng 1 giá trị khác (array khác) thì sẽ không ảnh hưởng đến arr2. Nếu như bạn thay đổi arr2[0] thì arr1[0] cũng sẽ thay đổi theo vì 2 vị trí này chia sẽ với nhau.

Thêm một ví dụ nữa để hiểu rõ hơn :

Thay đổi thuộc tính Object

const person1 = { name: 'Do Tuan', age: 23 }
const person2 = person1
person2.age = 20
console.log(person1) // { name: 'Do Tuan', age: 20 }
console.log(person2) // { name: 'Do Tuan', age: 20 }

Bạn đang thắc mắc tại sao khai báo bằng const rồi nhưng lại có thể thay đổi giá trị bên trong object được phải không? Thực ra thì khi bạn khai báo const kết hợp với object thì bạn sẽ không thể thay đổi object nhưng lại có thể thay đổi thuộc tính của nó.

Như ví dụ thì bạn không thể thay đổi person2 bằng một object mới được, mà chỉ có thể thay đổi person2.age hoặc person2.name. Điều này liên quan đến vùng nhớ như mình đã nói ở bên trên, nếu bạn thay đổi nguyên 1 object thì vùng nhớ của person2 sẽ thay đổi và const không cho phép nên sẽ gây lỗi. Nhưng nếu bạn thay đổi thuộc tính bên trong thì vùng nhớ object bên ngoài vẫn giữ nguyên.

3. What is pointer? Why do newer programming languages omit pointers?

Con trỏ là gì?

Con trỏ là 1 biến trong C, con trỏ chứa địa chỉ của biến mà nó trỏ đến.

- Kiểu dữ liệu của con trỏ: Kiểu dữ liệu của con trỏ trùng với kiểu dữ liệu tại vùng nhớ mà nó trỏ đến.

- Giá trị của con trỏ: chứa địa chỉ vùng nhớ mà con trỏ trỏ đến.

- Địa chỉ của con trỏ: địa chỉ của bản thân biến con trỏ đó trong RAM.

Tại sao Java không dùng con trỏ?

Bảo mật kém Với cách sử dụng con trỏ để tham chiếu đến bất kỳ ô nhớ nào trong bộ nhớ sẽ rất nguy hiểm nếu người lập trình không kiểm soát tốt các con trỏ của mình và nguy hiểm hơn nữa nếu thay đổi giá trị của một ô nhớ mà chương trình khác đang chạy dẫn đến những chương trình đó bị ảnh hưởng như chạy sai hoặc nghiêm trọng có thể bị treo chương trình,… - Với Java, sau khi đã loại bỏ con trỏ và thay vào đó bằng biến tham chiếu, biến này chỉ được tham chiếu đến vùng nhớ mà nó được cấp phép trong chương trình. Đó là lý do mà Java và những ngôn ngữ lập trình bậc cao hơn C/C++ loại bỏ con trỏ và thay vào đó là sử dụng biến tham chiếu.

Tuy nhiên, với nhược điểm của con trỏ là nguy hiểm khi trỏ đến bất kỳ ô nhớ nào trong bộ nhớ cũng chính là ưu điểm của nó khi lập trình yêu cầu các tương tác cấp thấp với phần cứng như lập trình các hệ điều hành, lập trình mạng, lập trình nhúng… (Hệ điều hành Windows nổi tiếng của Microsoft cũng được viết từ hợp ngữ và C/C++ đấy!).

Last updated