Tìm Hiểu Các Kiểu Dữ Liệu Trong Java
Trong Java, các kiểu dữ liệu được chia thành hai loại chính: kiểu dữ liệu nguyên thủy (Primitive Types) và kiểu dữ liệu tham chiếu (Reference Types).
1. Các Kiểu Dữ Liệu Nguyên Thủy
Các kiểu dữ liệu nguyên thủy bao gồm:
- boolean: Kiểu dữ liệu chỉ có hai giá trị là true và false.
- char: Kiểu dữ liệu lưu trữ một ký tự, được đại diện bởi 16 bit.
- byte: Lưu trữ số nguyên từ -128 đến 127, chiếm 8 bit.
- short: Lưu trữ số nguyên, chiếm 16 bit.
- int: Kiểu số nguyên phổ biến nhất, chiếm 32 bit.
- long: Lưu trữ số nguyên lớn hơn, chiếm 64 bit.
- float: Lưu trữ giá trị số thực (thập phân), sử dụng 32 bit.
- double: Lưu trữ giá trị số thực (thập phân) lớn hơn, sử dụng 64 bit.
Hãy lưu ý rằng, float và double đều được dùng để biểu diễn giá trị thập phân. Tuy nhiên, float sử dụng 32 bit trong khi double sử dụng 64 bit, do đó double có độ chính xác cao hơn. Khi khai báo biến thập phân trong Java, mặc định nó sẽ là kiểu double:
java
double d = 1.0;
float f1 = 1.9f; // Đúng
float f2 = 1.9; // Lỗi
Cả float và double đều có thể không hiển thị chính xác giá trị khi thực hiện các phép tính. Ví dụ:
java
System.out.println(2.0d - 1.1d); // Kết quả có thể là 0.8999999999999999
Vì vậy, khuyến khích người lập trình sử dụng BigDecimal để đảm bảo độ chính xác trong các phép toán với số thập phân:
java
BigDecimal b1 = new BigDecimal("2.0");
BigDecimal b2 = new BigDecimal("1.1");
System.out.println(b1.subtract(b2).floatValue());
Khi so sánh hai biến kiểu dữ liệu nguyên thủy, Java sẽ so sánh giá trị thực tế mà biến lưu trữ trong bộ nhớ.
2. Kiểu Dữ Liệu Tham Chiếu
Kiểu dữ liệu tham chiếu được dùng để lưu trữ các kiểu dữ liệu phức tạp hơn. Điều này cũng cho phép xử lý các giá trị NULL trong các DTO (Data Transfer Object) nhận từ frontend. Khi so sánh hai biến tham chiếu, Java sẽ so sánh địa chỉ ô nhớ mà biến trỏ đến. Hãy xem ví dụ sau:
java
Student student1 = new Student("Dat", 23);
Student student1_ = new Student("Dat", 23);
Student student2 = new Student("Thao", 21);
System.out.println(student1 == student2); // false
System.out.println(student1 == student1_); // false
Nếu sử dụng hàm equals
, và trong lớp Student, ta ghi đè phương thức này để so sánh đúng tên và tuổi của sinh viên:
java
public boolean equals(Object obj) {
if (obj.getClass() != Student.class) {
return false;
}
Student student = (Student)obj;
return this.name.equals(student.getName()) && this.age == student.getAge();
}
System.out.println(student1.equals(student1_)); // true
System.out.println(student1.equals(student2)); // false
Khi khai báo hai biến tham chiếu giống nhau, chúng sẽ trỏ đến cùng một vùng nhớ. Nếu thay đổi một trong hai, cả hai đều sẽ thay đổi:
java
int[] arr1 = new int[]{1, 2};
int[] arr2 = arr1; // redundant
student2 = student1; // redundant
arr1[0] = 2;
System.out.println(arr2[0]); // 2
System.out.println(student2.getName()); // Dat
Đến đây, bài viết về các kiểu dữ liệu trong Java đã kết thúc. Hẹn gặp lại các bạn trong các bài viết tiếp theo trong seri "Java Cơ Bản" nhé! 😊
source: viblo