biến, kiểu dữ liệu và toán tử trong java
Tung Bui Thanh (TungDaDev)13 mins read

Chào bạn quay lại với series Java Core Dành Cho Người Mới Bắt Đầu!
Bài trước bạn đã cài môi trường và in được dòng "Hello World". Hôm nay mình đi tới mấy viên gạch nền mà chương trình nào cũng cần: Biến (Variables), Kiểu dữ liệu (Data Types) và Toán tử (Operators).
Đọc xong bài này, bạn sẽ:
- Hiểu biến và kiểu dữ liệu là gì, theo cách dễ hình dung, dễ nhớ.
- Viết đúng cú pháp khai báo và dùng quen tay các phép toán thường gặp.
- Biết trước mấy cái bẫy hay gặp (chia số nguyên, so sánh chuỗi, sai số khi tính tiền) để khỏi dính những lỗi ngớ ngẩn mà dân đi làm lâu năm thỉnh thoảng vẫn dính!
# biến là gì?
Thử tưởng tượng trong phòng bạn có mấy cái hộp để cất đồ:
- Chiếc hộp dán nhãn
"Quần áo"chỉ dùng để đựng áo quần. - Chiếc hộp dán nhãn
"Sách vở"chỉ dùng để chứa sách. - Chiếc hộp dán nhãn
"Tiền tiết kiệm"dùng để cất tiền.
Trong lập trình, Biến (Variable) là một cái hộp có dán nhãn, nằm trong bộ nhớ máy tính (RAM), dùng để chứa dữ liệu. Đồ trong hộp thì thay ra thay vào được trong lúc chương trình chạy.
# cú pháp khai báo biến
<Kiểu_Dữ_Liệu> <Tên_Biến> = <Giá_Trị_Khởi_Tạo>;Ví dụ cụ thể:
public class VariableDemo {
public static void main(String[] args) {
// Khai báo một biến kiểu số nguyên tên là 'age' và gán giá trị 20
int age = 20;
// Khai báo biến chuỗi tên là 'fullName'
String fullName = "Bùi Thanh Tùng";
// Khai báo trước, gán giá trị sau cũng hoàn toàn hợp lệ
double salary;
salary = 1500.50;
// In các giá trị ra màn hình Console
System.out.println("Xin chào: " + fullName);
System.out.println("Tuổi hiện tại: " + age);
System.out.println("Mức lương: $" + salary);
// Thay đổi giá trị bên trong biến (đúng như tên gọi 'biến')
age = 21;
System.out.println("Tuổi sau sinh nhật: " + age);
}
}# quy tắc đặt tên biến
- Viết kiểu lạc đà (
camelCase): chữ đầu viết thường, các từ sau viết hoa chữ cái đầu (ví dụ:totalPrice,userEmail,accountBalance). - Tên phải nói lên ý nghĩa: đặt
customerAge, ĐỪNG đặt cho có kiểua,b,x1,temp. - Không bắt đầu bằng số:
1user(sai),user1(đúng). - Không trùng từ khoá của Java: không đặt tên biến là
class,int,public,return.
# hằng số với từ khóa final
Giá trị nào cố định, không bao giờ được đổi (như số PI, thuế VAT, số ngày trong tuần) thì thêm từ khoá final. Theo quy ước, tên hằng số viết hoa hết và nối bằng dấu gạch dưới (UPPER_SNAKE_CASE):
final double PI = 3.14159265359;
final int DAYS_IN_WEEK = 7;
// PI = 3.15; // LỖI BIÊN DỊCH! Java cấm thay đổi giá trị của hằng số final.# các kiểu dữ liệu nguyên thủy & String
Java là ngôn ngữ kiểu tĩnh (statically typed), kiểm tra kiểu rất gắt ngay lúc biên dịch. Hiểu đơn giản: trước khi bỏ đồ vào hộp, bạn phải nói rõ hộp này đựng loại đồ gì. (Từ Java 10 có var để trình biên dịch tự suy ra kiểu, nhưng kiểu vẫn được chốt cứng từ lúc khai báo.)
Kiểu dữ liệu trong Java chia làm 2 nhóm:
- Primitive Types (kiểu nguyên thuỷ): 8 kiểu cơ bản có sẵn trong ngôn ngữ, chứa thẳng giá trị.
- Reference Types (kiểu tham chiếu / đối tượng): các kiểu phức tạp hơn như
String,Array,Class, chứa địa chỉ trỏ tới dữ liệu.
# bảng tra cứu 8 kiểu nguyên thủy
| Kiểu dữ liệu | Kích thước | Khoảng giá trị | Ví dụ ngoài đời |
|---|---|---|---|
byte | 1 byte | -128 đến 127 | Tuổi con người, số tầng của tòa nhà |
short | 2 bytes | -32,768 đến 32,767 | Năm sinh (1998, 2026), số học sinh một trường |
int (Phổ biến nhất) | 4 bytes | Khoảng -2.14 tỷ đến +2.14 tỷ | Lượt xem YouTube, số lượng hàng trong kho |
long | 8 bytes | Rất lớn (khoảng 9.22 tỷ tỷ, tức 9.22 × 10^18) | Dân số thế giới, ID database lớn (thêm chữ L ở cuối: 10000000000L) |
float | 4 bytes | Số thực, chính xác khoảng 6–7 chữ số | Toạ độ GPS cơ bản (thêm chữ f ở cuối: 3.14f) |
double (Mặc định) | 8 bytes | Số thực, chính xác khoảng 15–16 chữ số | Chiều cao 1.75, điểm số 8.5, vận tốc vật lý |
boolean | 1 bit (logic, JVM thực tế thường dùng 1 byte) | Chỉ có 2 giá trị: true hoặc false | Trạng thái đăng nhập (isLoggedIn), đã thanh toán (isPaid) |
char | 2 bytes | Chứa 1 ký tự (đúng ra là 1 đơn vị UTF-16, emoji cần tới 2 char) | Đặt trong nháy đơn: 'A', 'Z', '8', '@' |
# kiểu chuỗi ký tự String
char chỉ chứa 1 ký tự và dùng nháy đơn ' ', còn String là một chuỗi văn bản đặt trong nháy kép " ":
char grade = 'A'; // char: 1 ký tự, nháy đơn
String message = "Học Java dễ ẹc!"; // String: chuỗi chữ, nháy kép# các toán tử cơ bản trong java
Toán tử là mấy ký hiệu dùng để tính toán, so sánh giá trị hoặc ghép các điều kiện logic lại với nhau.
# toán tử số học
int a = 10;
int b = 3;
System.out.println(a + b); // Cộng: 13
System.out.println(a - b); // Trừ: 7
System.out.println(a * b); // Nhân: 30
System.out.println(a / b); // Chia lấy phần nguyên: 3 (Vì 10 chia 3 được 3 dư 1)
System.out.println(a % b); // Chia lấy phần DƯ (Modulo): 1TIP
Phép chia lấy dư % dùng được vào nhiều việc:
- Kiểm tra số chẵn / lẻ:
number % 2 == 0-> Số chẵn. - Chia nhóm hoặc tạo vòng lặp luân phiên.
# toán tử tăng giảm (++ và --)
Dùng để tăng hoặc giảm biến đi 1 đơn vị:
a++hoặc++atương đương vớia = a + 1;a--hoặc--atương đương vớia = a - 1;
Tiền tố (++a) khác hậu tố (a++) chỗ nào:
++a(tiền tố): tăng trước, rồi mới lấy giá trị đi tính.a++(hậu tố): lấy giá trị hiện tại đi tính trước, xong mới tăng biến lên.
int x = 5;
int y = x++; // y nhận giá trị 5 trước, sau đó x mới tăng lên 6!
System.out.println("x = " + x + ", y = " + y); // x = 6, y = 5
int m = 5;
int n = ++m; // m tăng lên 6 trước, sau đó gán giá trị 6 cho n!
System.out.println("m = " + m + ", n = " + n); // m = 6, n = 6# toán tử so sánh
Kết quả luôn là boolean (true hoặc false):
| Toán tử | Ý nghĩa | Ví dụ (x = 10, y = 5) | Kết quả |
|---|---|---|---|
== | So sánh bằng nhau | x == y | false |
!= | So sánh khác nhau (không bằng) | x != y | true |
> | Lớn hơn | x > y | true |
< | Nhỏ hơn | x < y | false |
>= | Lớn hơn hoặc bằng | x >= 10 | true |
<= | Nhỏ hơn hoặc bằng | y <= 4 | false |
# toán tử logic
Dùng để ghép nhiều điều kiện lại:
&&(VÀ - AND): ratruekhi TẤT CẢ điều kiện đều đúng.||(HOẶC - OR): ratruekhi CHỈ CẦN 1 điều kiện đúng.!(PHỦ ĐỊNH - NOT): đảo ngược (!truethànhfalse,!falsethànhtrue).
int age = 22;
boolean hasDrivingLicense = true;
// Bạn chỉ được lái xe khi đủ 18 tuổi VÀ có bằng lái:
boolean canDrive = (age >= 18) && hasDrivingLicense;
System.out.println("Được phép lái xe? " + canDrive); // true
// Được giảm giá vé nếu là trẻ em (< 12 tuổi) HOẶC người cao tuổi (> 60 tuổi):
boolean hasDiscount = (age < 12) || (age > 60);
System.out.println("Được giảm giá? " + hasDiscount); // false# mấy cái bẫy hay gặp
# phép chia số nguyên bị mất phần thập phân
Xem đoạn code này:
int a = 5;
int b = 2;
double result = a / b;
System.out.println("5 chia 2 bằng: " + result);
// Bạn mong đợi 2.5? Kết quả in ra lại là: 2.0!Sao lại thế? Vì a và b đều là số nguyên (int), Java chia nguyên trước: 5 / 2 = 2. Xong rồi mới gán số 2 đó vào biến double, thành ra 2.0!
Cách sửa: ép ít nhất một trong hai số sang số thực (double):
double result = (double) a / b; // Ép 'a' thành 5.0 -> 5.0 / 2 = 2.5 (Chính xác!)# so sánh hai chuỗi bằng toán tử ==
String name1 = new String("Tung");
String name2 = new String("Tung");
System.out.println(name1 == name2); // IN RA FALSE! TẠI SAO?Lý do:
- Với kiểu đối tượng (
Object/String),==chỉ so địa chỉ bộ nhớ (hai người có ở chung một nhà không), chứ không so nội dung chữ bên trong! name1vàname2là hai cái hộp riêng, nằm ở hai ô nhớ khác nhau trên RAM, nên==rafalse.
WARNING
Quy tắc phải nhớ: LUÔN DÙNG .equals() ĐỂ SO SÁNH CHUỖI!
System.out.println(name1.equals(name2)); // IN RA TRUE!# tại sao 0.1 + 0.2 != 0.3?
Chạy thử đoạn code này xem, khá vui:
double x = 0.1;
double y = 0.2;
System.out.println(x + y); // In ra: 0.30000000000000004!
System.out.println(x + y == 0.3); // In ra: false!Lý do: máy tính chạy bằng bóng bán dẫn, chỉ hiểu nhị phân 0 và 1 (cơ số 2). Giống như phân số 1/3 = 0.33333... là số thập phân vô hạn tuần hoàn, thì trong hệ nhị phân, 0.1 và 0.2 cũng vô hạn tuần hoàn, máy buộc phải cắt bớt một chút ở đuôi!
Hậu quả: mỗi phép tính chỉ lệch một chút xíu, nhưng với tiền thì lệch một chút cũng là sai. So sánh == ra false như trên, làm tròn tới đồng/cent thì thỉnh thoảng lệch 1 đơn vị, đối soát sổ sách không khớp. Cộng 10 triệu lần $0.10 bằng double ra 999999.9998389754 chứ không phải 1000000; còn dùng float thì lệch tới hơn 87 nghìn đô!
Cách xử lý: code nào dính tới tiền, hoá đơn, lãi suất thì luôn dùng java.math.BigDecimal, khởi tạo từ String:
import java.math.BigDecimal;
BigDecimal price1 = new BigDecimal("0.1");
BigDecimal price2 = new BigDecimal("0.2");
BigDecimal total = price1.add(price2);
System.out.println(total); // In ra chuẩn xác 100%: 0.3# hiện tượng tràn số integer overflow
int chỉ chứa được tối đa tới 2,147,483,647. Cộng thêm 1 nữa thì sao?
int max = Integer.MAX_VALUE; // 2,147,483,647
int overflowed = max + 1;
System.out.println("Kết quả: " + overflowed); // In ra: -2147483648!Nó không báo lỗi gì cả, mà giống cái đồng hồ công-tơ-mét xe máy chạy hết vòng, quay về số âm nhỏ nhất! Bài học: số liệu nào có khả năng vượt 2 tỷ (ID tài khoản, doanh thu tập đoàn...) thì chọn long ngay từ đầu! Muốn tràn số thì báo lỗi thay vì lặng lẽ ra số sai, dùng Math.addExact(max, 1): nó ném ArithmeticException khi tràn.
# bài tập thực hành
Mở IDE lên, tạo class mới rồi tự giải 3 bài nhỏ này nhé:
# bài 1: máy tính chỉ số bmi
- Khai báo chiều cao (kiểu
double, đơn vị mét, ví dụ1.72) và cân nặng (kiểudouble, đơn vị kg, ví dụ65.5). - Tính chỉ số:
BMI = Cân nặng / (Chiều cao * Chiều cao). - In chỉ số BMI ra màn hình.
# bài 2: máy đổi đơn vị thời gian
- Cho một biến
int totalSeconds = 3665;(tổng số giây). - Dùng
/và%để đổi ra: bao nhiêu Giờ, bao nhiêu Phút, bao nhiêu Giây? (Gợi ý: 1 giờ = 3600 giây, 1 phút = 60 giây).
# bài 3: kiểm tra điều kiện mua hàng
- Khai báo biến
int accountBalance = 500;(số dư tài khoản) vàint itemPrice = 200;(giá món hàng),boolean isStoreOpen = true;. - Viết biểu thức boolean kiểm tra khách có thoả cả 2 điều kiện: Số dư >= giá hàng VÀ cửa hàng đang mở cửa hay không?
# kết luận
Thuật toán phức tạp cỡ nào, hệ thống AI to cỡ nào thì rốt cuộc cũng ghép lại từ mấy cái hộp biến và mấy phép toán cơ bản này thôi.
Bạn chỉ cần nắm chắc:
- Chọn đúng kiểu dữ liệu:
intcho số nguyên,doublecho số thực,booleancho đúng sai,Stringcho văn bản. - Cẩn thận phép chia số nguyên và luôn dùng
.equals()để so sánh chuỗi. - Tiền bạc thì nhớ tới
BigDecimal.
Vậy là nền của bạn đã chắc hơn 80% người mới học rồi đó! Bài sau mình sẽ qua câu lệnh điều kiện if-else và vòng lặp for/while, để bắt đầu bảo máy tính tự ra quyết định!
Học vui nhé! Có chỗ nào thắc mắc thì cứ để lại câu hỏi, mình cùng bàn! 🚀
Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!
Happy coding 😎 👍🏻 🚀 🔥.