Giải thích các kiểu dữ liệu Java: Kiểu nguyên thủy vs Kiểu tham chiếu, Ép kiểu và Lớp bao bọc

目次

1. Kiểu Dữ Liệu Java Là Gì? Các Nguyên Tắc Cơ Bản Và Tổng Quan

Kiểu dữ liệu Java là một cơ chế xác định loại giá trị mà một biến có thể lưu trữ.
Java nhấn mạnh an toàn kiểu (một thiết kế ngăn chặn các hoạt động kiểu không hợp lệ tại thời điểm biên dịch), vì vậy mọi biến phải có kiểu được khai báo.

Ví dụ, hãy xem mã sau.

int number = 10;
double price = 19.8;
String name = "Java";
  • int → chỉ số nguyên
  • double → chỉ số thập phân
  • String → chỉ chuỗi

Bằng cách làm cho các kiểu rõ ràng, bạn nhận được lợi ích như:

  • Ngăn chặn các phép gán không hợp lệ
  • Tối ưu hóa việc sử dụng bộ nhớ
  • Phát hiện lỗi tại thời điểm biên dịch

Nếu không có kiểu, các lỗi như gán chuỗi cho số nguyên sẽ không được phát hiện cho đến thời điểm chạy. Java được thiết kế để ngăn chặn điều đó.

1.1 Kiểu Dữ Liệu Là Gì? (Định Nghĩa Thân Thiện Với Người Mới Bắt Đầu)

Hãy nghĩ về kiểu dữ liệu như “loại giá trị mà một biến được phép xử lý.”

Cú pháp cơ bản là:

TypeName variableName = value;

Ví dụ:

int age = 25;

Trong trường hợp này:

  • int là kiểu
  • age là tên biến
  • 25 là giá trị

Đó là mối quan hệ.

Nếu bạn viết như này, bạn sẽ nhận được lỗi:

int age = "25";  // Compile-time error

Bạn không thể gán chuỗi cho kiểu số nguyên. Đây là cách an toàn kiểu hoạt động.

Những Sai Lầm Phổ Biến Của Người Mới Bắt Đầu

  • Giả định bạn có thể bỏ qua kiểu (trong Java, bạn thường không thể)
  • Nhầm lẫn giữa số và chuỗi
  • Nhầm lẫn = (gán) và == (so sánh)

1.2 Phân Loại Kiểu Dữ Liệu Java (Hai Loại)

Kiểu dữ liệu Java được chia rộng rãi thành hai loại:

  1. Kiểu nguyên thủy
  2. Kiểu tham chiếu

Kiểu nguyên thủy là gì?

Các kiểu lưu trữ giá trị thực tế trực tiếp.
Ví dụ: int, double, boolean, v.v.

Đặc điểm:

  • Tiết kiệm bộ nhớ
  • Nhanh
  • Không thể chứa null

Kiểu tham chiếu là gì?

Các kiểu lưu trữ không phải giá trị chính nó, mà là “tham chiếu” đến nơi giá trị được lưu trữ.

Ví dụ:

String text = "Hello";

String là kiểu lớp (một kiểu tham chiếu).

Đặc điểm:

  • Được tạo dựa trên lớp
  • Có thể được gán null
  • Có phương thức (hành vi)

1.3 Sự Khác Biệt Trong Hành Vi “Giá Trị vs Tham Chiếu”

Hãy xác nhận sự khác biệt với một ví dụ đơn giản.

int a = 10;
int b = a;
b = 20;

Trong trường hợp này:

  • a vẫn là 10
  • Chỉ b trở thành 20

Mặt khác, kiểu tham chiếu hoạt động như thế này:

String s1 = "Java";
String s2 = s1;

Ở đây, s1s2 có thể tham chiếu đến cùng một đối tượng (điều này có thể thay đổi tùy thuộc vào triển khai và tối ưu hóa).

Những Điểm Khó Phổ Biến

  • Hiểu lầm String là kiểu nguyên thủy
  • Giả định sao chép kiểu tham chiếu sao chép giá trị chính nó
  • Không hiểu cách null hoạt động

1.4 Tại Sao Việc Hiểu Kiểu Dữ Liệu Quan Trọng

Việc hiểu kém về kiểu dữ liệu có thể gây ra vấn đề như:

  • Kết quả tính toán bất ngờ
  • Tràn số (vượt quá phạm vi giá trị)
  • NullPointerException
  • Lỗi chuyển đổi kiểu

Để sử dụng Java đúng cách, bạn phải hiểu tổng quan về kiểu dữ liệu trước.

2. Kiểu Nguyên Thủy (Kiểu Dữ Liệu Cơ Bản): Danh Sách Và Cách Sử Dụng Chúng

Kiểu nguyên thủy là kiểu dữ liệu lưu trữ giá trị thực tế trực tiếp.
Java có 8 kiểu nguyên thủy.

CategoryTypeSizeTypical Use
Integerbyte8bitSmall integers
Integershort16bitSmaller integers
Integerint32bitStandard integers
Integerlong64bitLarge integers
Decimalfloat32bitSingle-precision floating point
Decimaldouble64bitDouble-precision floating point (standard)
Characterchar16bitA single character
Booleanbooleantrue / false

*Kích thước được cố định bởi thông số kỹ thuật Java (không phụ thuộc vào môi trường).

2.1 Kiểu Số Nguyên (byte / short / int / long)

Sử dụng cơ bản

int number = 100;
long population = 8000000000L;

Phạm vi (các ví dụ phổ biến)

  • byte: -128 đến 127
  • short: -32,768 đến 32,767
  • int: khoảng ±2.1 tỷ
  • long: khoảng ±9.22 x 10^18

Trong hầu hết các trường hợp, int là đủ.
Hiếm khi có nhu cầu thực tế sử dụng byte hoặc short chỉ để tiết kiệm bộ nhớ.

Lưu Ý Quan Trọng Khi Sử Dụng long

long value = 10000000000L;  // L is required

Không có L, hằng số được coi là int và có thể gây lỗi biên dịch do vượt phạm vi.

Các lỗi thường gặp

  • Tràn giá trị khi vượt quá phạm vi
  • Quên thêm L cho hằng long
  • Không nhận ra tràn trong các phép tính intint

2.2 Kiểu số thực (float / double)

double price = 19.99;
float rate = 0.5f;

Quy tắc cơ bản

  • Thông thường, dùng double
  • float cần hậu tố f
    float value = 3.14f;
    

Sự khác biệt về độ chính xác

  • float: khoảng 7 chữ số thập phân
  • double: khoảng 15 chữ số thập phân

Lưu ý quan trọng (vấn đề làm tròn/độ chính xác)

System.out.println(0.1 + 0.2);

Kết quả có thể không chính xác là 0.3.
Điều này do đại diện số thực nhị phân.

Tính toán tiền tệ

Đối với việc xử lý tiền, double thường không được khuyến nghị.
Sử dụng BigDecimal an toàn hơn.

Các lỗi thường gặp

  • Dùng double cho tiền tệ
  • Nhầm lẫn giữa floatdouble
  • So sánh các số thập phân bằng ==

2.3 Kiểu ký tự (char)

char letter = 'A';
  • Dùng dấu nháy đơn
  • Quản lý bằng Unicode (tiêu chuẩn mã hoá ký tự)
  • Chỉ có thể lưu một ký tự duy nhất
    char kanji = '日';
    

Các lỗi thường gặp

  • Dùng dấu nháy kép (đó là String)
  • Cố gắng lưu nhiều ký tự

2.4 Kiểu Boolean (boolean)

boolean isActive = true;
  • Giá trị chỉ có true hoặc false
  • Không thể dùng 0/1 (khác với C)
    boolean result = (5 > 3);
    

Các lỗi thường gặp

  • Cố gắng gán một số
  • Quên viết biểu thức so sánh

2.5 Ghi chú chung cho các Kiểu Nguyên thủy

  • Không thể gán null
  • Giá trị mặc định được tự động thiết lập cho các trường, nhưng biến cục bộ phải được khởi tạo
    int x;
    System.out.println(x);  // Compile-time error (uninitialized)
    

Các kiểu nguyên thủy nhanh và nhẹ, nhưng chúng có hạn chế như không hỗ trợ null và không có phương thức.

3. Kiểu Tham chiếu: Những Điều Cơ Bản

Kiểu tham chiếu lưu không phải giá trị thực tế, mà là một tham chiếu (địa chỉ bộ nhớ) tới một đối tượng.
Sự khác biệt lớn nhất so với các kiểu nguyên thủy là “dữ liệu thực tế” và “biến” tồn tại riêng biệt.

Xem ví dụ sau:

String text = "Java";

Ở đây, text lưu một tham chiếu tới đối tượng chuỗi, không phải giá trị chuỗi thực tế.

3.1 Kiểu String (Kiểu Tham chiếu Phổ biến Nhất)

String là một kiểu lớp. Nó không phải là kiểu nguyên thủy.

String name = "Taro";

Đặc điểm

  • Bất biến (không thể thay đổi)
  • Có thể gán null
  • Có các phương thức
    String str = "Hello";
    System.out.println(str.length());  // 5
    

Cú pháp bất biến gây bất ngờ

String s = "Java";
s.concat(" SE");
System.out.println(s);  // "Java"

concat() trả về một chuỗi mới, nhưng chuỗi gốc không bị thay đổi.

Cách sử dụng đúng:

s = s.concat(" SE");

Các lỗi thường gặp

  • Giả định String là kiểu nguyên thủy
  • Dùng == để so sánh chuỗi
  • Nối chuỗi quá nhiều gây vấn đề hiệu năng (nên dùng StringBuilder)

3.2 Mảng và Kiểu Lớp

Mảng

int[] numbers = {1, 2, 3};

Mảng cũng là kiểu tham chiếu.

int[] a = {1, 2};
int[] b = a;
b[0] = 99;

System.out.println(a[0]);  // 99

ab tham chiếu cùng một mảng, nên các thay đổi ảnh hưởng đến cả hai.

Kiểu lớp

class Person {
    String name;
}

Person p = new Person();
p.name = "Ken";

new là từ khóa dùng để tạo một đối tượng.

3.3 Null là gì?

null đại diện cho trạng thái “không có đối tượng nào được tham chiếu”.

String text = null;

Gọi một phương thức khi tham chiếu là null sẽ gây lỗi.

text.length();  // NullPointerException

Điều này được gọi là NullPointerException (NPE).

Cách xử lý null

if (text != null) {
    System.out.println(text.length());
}

3.4 Sự khác biệt giữa == và equals()

== (so sánh tham chiếu)

So sánh xem địa chỉ bộ nhớ có giống nhau hay không.

.

equals() (so sánh nội dung)

So sánh xem nội dung có giống nhau hay không.

String a = new String("Java");
String b = new String("Java");

System.out.println(a == b);        // false
System.out.println(a.equals(b));   // true

Sai lầm thường gặp

  • Sử dụng == để so sánh chuỗi
  • Gọi equals() mà không kiểm tra null
  • Nhầm lẫn giữa sao chép tham chiếu và sao chép giá trị

3.5 Tóm tắt nhanh: Khác biệt so với các kiểu nguyên thủy

ItemPrimitive TypesReference Types
StoresThe value itselfA reference
nullNot allowedAllowed
MethodsNoYes
newNot neededUsually needed

Các kiểu tham chiếu linh hoạt, nhưng bạn phải cẩn thận với việc xử lý null và các tham chiếu chia sẻ.

4. Lớp Wrapper và Autoboxing

Các lớp wrapper là các lớp cho phép bạn xử lý các giá trị nguyên thủy như là đối tượng.
Trong Java, các collection (như List và Map) chỉ có thể lưu trữ các kiểu tham chiếu, vì vậy bạn không thể lưu trữ các kiểu nguyên thủy trực tiếp. Các lớp wrapper tồn tại để đáp ứng nhu cầu này.

4.1 Các lớp Wrapper thường dùng

Primitive TypeWrapper Class
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

Ví dụ:

Integer number = 10;
Double price = 19.99;

Vì các lớp wrapper là kiểu tham chiếu, chúng có thể chứa null.

Integer value = null;  // OK

4.2 Autoboxing là gì?

Boxing có nghĩa là chuyển một kiểu nguyên thủy thành một lớp wrapper.

Kể từ Java 5, việc chuyển đổi này có thể diễn ra tự động.

Integer num = 10;  // autoboxing

Nội bộ, điều này tương đương với:

Integer num = Integer.valueOf(10);

4.3 Unboxing là gì?

Unboxing chuyển một lớp wrapper trở lại thành kiểu nguyên thủy.

Integer num = 20;
int value = num;  // auto-unboxing

Nội bộ:

int value = num.intValue();

4.4 Khi nào cần sử dụng các lớp Wrapper

1. Khi sử dụng collection

import java.util.ArrayList;

ArrayList<Integer> list = new ArrayList<>();
list.add(10);  // autoboxing

Bạn không thể sử dụng ArrayList<int>.

2. Khi cần xử lý null

Integer score = null;

Các kiểu nguyên thủy không thể là null.

4.5 Ghi chú và Sai lầm thường gặp

1. Ngoại lệ khi unboxing null

Integer num = null;
int value = num;  // NullPointerException

Một ngoại lệ xảy ra trong quá trình auto-unboxing.

2. So sánh bằng ==

Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);  // may be false

Vì đây là các đối tượng, == so sánh tham chiếu.
Hãy dùng equals() để so sánh nội dung.

a.equals(b);

3. Ảnh hưởng đến hiệu năng

Các lớp wrapper có thể tạo ra đối tượng,
do đó các phép tính nặng có thể chậm hơn so với việc sử dụng các kiểu nguyên thủy.

4.6 Lựa chọn giữa Kiểu Nguyên thủy và Lớp Wrapper

  • Tính toán số học → kiểu nguyên thủy
  • Lưu trữ trong collection → lớp wrapper
  • Xử lý null → lớp wrapper

Nếu bạn nhớ các hướng dẫn này, bạn sẽ không ngần ngại trong công việc thực tế.

5. Chuyển đổi Kiểu (Casting): Cơ bản

Trong Java, khi bạn làm việc với các giá trị qua các kiểu dữ liệu khác nhau, bạn sử dụng chuyển đổi kiểu (casting).
Có hai loại chính:

  • Chuyển đổi ngầm (widening conversion)
  • Chuyển đổi tường minh (narrowing conversion)

5.1 Chuyển đổi Ngầm (Widening)

Việc chuyển đổi từ kiểu có phạm vi nhỏ hơn sang kiểu có phạm vi lớn hơn diễn ra tự động.

int num = 100;
long bigNum = num;  // automatic conversion

Điều này an toàn vì nó mở rộng phạm vi số.

Thứ tự chuyển đổi (ví dụ liên quan đến số nguyên)

byte → short → int → long → float → double

Ví dụ

int a = 10;
double b = a;  // OK

Lưu ý

  • Độ chính xác được giữ trong nhiều trường hợp, nhưng có thể làm tròn khi dùng float hoặc double.
  • char có thể được chuyển đổi thành giá trị số nguyên.
    char c = 'A';
    int code = c;  // 65
    

5.2 Chuyển đổi Tường minh (Narrowing)

Khi chuyển đổi từ kiểu lớn hơn sang kiểu nhỏ hơn, bạn phải ép kiểu một cách tường minh.

double price = 19.99;
int rounded = (int) price;

Kết quả là:

rounded = 19

Phần thập phân sẽ bị bỏ đi.

Cú pháp

(TargetType) variable

5.3 Ví dụ về Mất Dữ Liệu

int big = 1000;
byte small = (byte) big;
System.out.println(small);

Kết quả không phải là “không thể dự đoán,” mà là bị bọc để phù hợp với phạm vi mục tiêu.
Ở đây, 1000 vượt quá phạm vi byte, vì vậy giá trị thay đổi.

Những quan niệm sai lầm phổ biến

  • Nghĩ rằng nó sẽ gây lỗi → trong thực tế, giá trị thay đổi
  • Giả định rằng nó luôn an toàn → mất dữ liệu có thể xảy ra

5.4 Một Bẫy: Phép Chia Nguyên

int a = 5;
int b = 2;
double result = a / b;
System.out.println(result);

Kết quả là:

2.0

Phép chia nguyên được thực hiện như một phép toán nguyên.

Cách tiếp cận đúng:

double result = (double) a / b;

Kết quả:

2.5

5.5 Ghi Chú về So Sánh Số Thập Phân

double x = 0.1 + 0.2;
System.out.println(x == 0.3);  // may be false

Điều này là do vấn đề độ chính xác điểm nổi.

Một so sánh an toàn hơn

Math.abs(x - 0.3) < 0.000001

5.6 Ép Kiểu Các Loại Tham Chiếu

Bạn cũng có thể ép kiểu các loại tham chiếu (khi có mối quan hệ kế thừa).

Object obj = "Java";
String str = (String) obj;

Ép kiểu sang loại không đúng gây ra ngoại lệ.

Integer num = (Integer) obj;  // ClassCastException

Tóm Tắt Các Lỗi Phổ Biến

  • Chuyển đổi ngoài phạm vi thay đổi giá trị
  • Không nhận ra phép chia nguyên
  • So sánh số thập phân với ==
  • Ép kiểu tham chiếu không hợp lệ

Ép kiểu thường không kích hoạt lỗi thời biên dịch, vì vậy sự hiểu lầm có thể dễ dàng dẫn đến lỗi.

6. Hướng Dẫn Chọn Loại Thực Tế (Để Bạn Không Do Dự Tại Nơi Làm Việc)

Bây giờ bạn hiểu cách các loại dữ liệu Java hoạt động, một câu hỏi thực tế phổ biến là: “Nên sử dụng loại nào?” Phần này tổ chức các tiêu chí quyết định thực tế.

6.1 Tại Sao int và double Thường Đủ

Sử dụng int cho số nguyên (mặc định)

int count = 100;

Lý do:

  • Phạm vi 32-bit đủ cho hầu hết các trường hợp
  • Dễ dàng hơn cho JVM tối ưu hóa
  • Dễ đọc và chuẩn

Bạn thường không cần ép sử dụng byte hoặc short.
Chọn các loại nhỏ hơn chỉ để tiết kiệm bộ nhớ thường chỉ dành cho các trường hợp đặc biệt (như mảng lớn).

Sử dụng double cho số thập phân (mặc định)

double rate = 0.75;

Nó có độ chính xác cao hơn float và là lựa chọn chuẩn.
Trừ khi bạn có lý do rõ ràng, hãy chọn double.

6.2 Tại Sao Bạn Nên Sử Dụng BigDecimal Cho Tiền Bạc

Mã này rủi ro cho tiền bạc:

double price = 0.1 + 0.2;

Vì lỗi điểm nổi, bạn có thể không nhận được giá trị chính xác.

Cách tiếp cận đúng:

import java.math.BigDecimal;

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b);

Tại sao truyền chuỗi?

new BigDecimal(0.1);  // not recommended

Tạo từ double có thể mang theo lỗi độ chính xác của nó.

Các lỗi phổ biến

  • Xử lý tiền với double
  • Sử dụng new BigDecimal(doubleValue)
  • Quên quy tắc làm tròn

6.3 Các Bộ Sưu Tập Yêu Cầu Các Lớp Bao Bọc

import java.util.ArrayList;

ArrayList<Integer> list = new ArrayList<>();
list.add(10);

Bạn không thể sử dụng các loại nguyên thủy trực tiếp.

ArrayList<int> list;  // Compile-time error

Lý do:

  • Generics (bộ sưu tập an toàn loại) chỉ hỗ trợ các loại tham chiếu

6.4 Quyết Định Dựa Trên Việc Bạn Có Cần null Không

Không cần null → các loại nguyên thủy

int age = 0;

Cần null → các lớp bao bọc

Integer age = null;

Trong tích hợp cơ sở dữ liệu hoặc đầu vào biểu mẫu, bạn có thể cần xử lý null.

6.5 Hướng Dẫn Hiệu Suất Cơ Bản

  • Tính toán → các loại nguyên thủy
  • Bộ sưu tập → các lớp bao bọc
  • Tránh tạo bao bọc bên trong vòng lặp chặt chẽ

Ví dụ (không khuyến nghị):

for (Integer i = 0; i < 1000000; i++) { }

Sử dụng các loại nguyên thủy hiệu quả hơn.

6.6 Bảng Tóm Tắt: Các Loại Khuyến Nghị Theo Trường Hợp Sử Dụng

Use CaseRecommended Type
Typical integersint
Typical decimalsdouble
MoneyBigDecimal
Boolean checksboolean
StringsString
Storing in collectionsWrapper classes

Các Lỗi Thực Tế Phổ Biến

  • Chọn các kiểu quá nhỏ không cần thiết
  • Sử dụng double cho tiền
  • Thiết kế mà không xem xét null
  • Các ngoại lệ auto-unboxing từ các lớp wrapper

Việc lựa chọn kiểu là một phần cốt lõi của thiết kế. Nếu bạn tiến hành một cách mơ hồ, chi phí sửa chữa các vấn đề sau này sẽ tăng đáng kể.

7. Tổng Kết Kiểu Dữ Liệu Java (Kèm Bảng)

Hãy tóm tắt mọi thứ trong một định dạng trả lời nhanh chóng cho các truy vấn tìm kiếm phổ biến. Kiểu dữ liệu Java được chia thành “kiểu nguyên thủy” và “kiểu tham chiếu.”

7.1 Danh Sách Kiểu Nguyên Thủy

TypeSizeDefault (fields)Typical Use
byte8bit0Small integers
short16bit0Smaller integers
int32bit0Standard integers
long64bit0LLarge integers
float32bit0.0fSingle-precision floating point
double64bit0.0dStandard floating point
char16bit‘\u0000’A single character
booleanfalseBoolean value
  • Các biến cục bộ không được khởi tạo tự động.

Các điểm chính

  • Đối với các phép tính số, mặc định sử dụng int / double
  • Đối với tiền, sử dụng BigDecimal
  • null không được phép
  • Không có phương thức

7.2 Tổng Quan Kiểu Tham Chiếu

Các kiểu tham chiếu thường gặp:

  • String
  • Mảng (ví dụ, int[] )
  • Kiểu lớp (các lớp tùy chỉnh)
  • Các lớp wrapper (ví dụ, Integer )
  • Các collection (List, Map, v.v.)

Tóm tắt các đặc điểm

ItemReference Types
Can assign nullYes
MethodsAvailable
new keywordUsually needed
Comparisonequals() recommended

7.3 So Sánh Cuối Cùng: Nguyên Thủy vs Tham Chiếu

PerspectivePrimitive TypesReference Types
StoresDirectlyBy reference
Memory efficiencyHighSomewhat lower
nullNoYes
SpeedFastSomewhat slower
Main useCalculationsObject handling

7.4 Bộ Kiểu Tối Thiểu Mà Người Mới Nên Học Đầu Tiên

Bắt đầu với bốn kiểu sau:

  • int
  • double
  • String
  • boolean

Với những kiểu này, bạn có thể xây dựng các chương trình cơ bản.

7.5 Các Sai Lầm Chung

  1. So sánh String bằng ==
  2. Sử dụng double cho tiền
  3. Không nhận ra phép chia nguyên
  4. Quên kiểm tra null
  5. Quên thêm L cho các literal long
  6. Unboxing null trong các lớp wrapper

Tránh những lỗi này sẽ giảm đáng kể các lỗi của người mới.

7.6 Kết Luận Cuối Cùng

  • Java là một ngôn ngữ an toàn kiểu
  • Hiểu các kiểu dữ liệu là nền tảng của mọi mã
  • Kiểu nguyên thủy dùng cho các phép tính nhanh
  • Kiểu tham chiếu dùng để quản lý đối tượng
  • Lựa chọn kiểu đúng ảnh hưởng trực tiếp đến chất lượng

Câu Hỏi Thường Gặp

Q1. Có bao nhiêu kiểu dữ liệu Java?

Trả lời:
Có 8 kiểu nguyên thủy. Kiểu tham chiếu có thể vô số (các lớp, mảng, giao diện, v.v.). Điều quan trọng là trước tiên phải hiểu 8 kiểu nguyên thủy.

Q2. String có phải là kiểu nguyên thủy không?

Trả lời:
Không. String là một kiểu lớp (kiểu tham chiếu). Nó được coi như một đối tượng và có thể được gán giá trị null.

Q3. Sự khác biệt giữa int và Integer là gì?

Trả lời:
int là một kiểu nguyên thủy. Integer là một lớp wrapper (kiểu tham chiếu). Integer có thể chứa null, nhưng việc auto-unboxing có thể gây ra ngoại lệ.

Q4. Tôi có thể dùng double cho các phép tính tiền không?

Trả lời:
Kỹ thuật thì có, nhưng không được khuyến khích. Các vấn đề về độ chính xác của số thực có thể xảy ra, vì vậy sử dụng BigDecimal an toàn hơn.

Q5. Tại sao phép chia các số nguyên không cho ra kết quả thập phân?

Trả lời:
Bởi vì các phép toán trên số nguyên được thực hiện bằng kiểu nguyên, phần thập phân sẽ bị bỏ qua. Nếu bạn cần kết quả thập phân, hãy ép kiểu một trong các toán hạng sang double.

Q6. null là gì?

Trả lời:
Nó đại diện cho trạng thái không có đối tượng nào được tham chiếu. Gọi một phương thức trên null sẽ gây ra NullPointerException.

Q7. Sự khác biệt giữa == và equals() là gì?

Trả lời:
== so sánh các tham chiếu (địa chỉ bộ nhớ). equals() so sánh nội dung. Đối với so sánh chuỗi, hãy dùng equals().

Q8. Những kiểu nào nên học đầu tiên cho người mới bắt đầu?

Trả lời:
Ưu tiên học int, double, Stringboolean. Đây là những kiểu cốt lõi được sử dụng phổ biến nhất trong công việc thực tế.