Xuất và Nhập Dữ Liệu Console
Trong Java, việc tương tác với người dùng qua console thường sử dụng lớp System. Để hiển thị thông tin, chúng ta có hai phương thức chính:
System.out.println(): In nội dung ra màn hình và tự động xuống dòng.System.out.print(): In nội dung nhưng giữ con trỏ ở cuối dòng, không xuống dòng.
Đối với việc định dạng chuỗi đầu ra, phương thức printf hỗ trợ các ký tự đặc biệt để quy định kiểu dữ liệu hiển thị:
| Ký hiệu | Chức năng |
|---|---|
| %d | Số nguyên thập phân |
| %x | Số nguyên hệ hexa |
| %f | Số thực dấu phẩy động |
| %e | Số thực dạng khoa học |
| %s | Chuỗi ký tự |
String productName = "Laptop";
int quantity = 5;
double price = 999.50;
System.out.printf("Item: %s, Count: %d, Total: %.2f%n", productName, quantity, price);
Để nhận dữ liệu từ người dùng, lớp Scanner trong gói java.util được sử dụng phổ biến. Quy trình bao gồm khởi tạo đối tượng gắn với System.in và gọi các phương thức đọc tương ứng:
import java.util.Scanner;
Scanner keyboard = new Scanner(System.in);
String userName = keyboard.nextLine(); // Đọc chuỗi
int userAge = keyboard.nextInt(); // Đọc số nguyên
Câu Lệnh Điều Kiện If
Cấu trúc if-else cho phép thực thi các khối mã dựa trên biểu thức logic. Cú pháp cơ bản bao gồm các nhánh if, else if và else.
if (condition) {
// Khối lệnh 1
} else if (anotherCondition) {
// Khối lệnh 2
} else {
// Khối lệnh 3
}
Lưu ý quan trọng khi so sánh dữ liệu:
- Với kiểu nguyên thủy (int, double...), sử dụng toán tử
==để so sánh giá trị. - Với kiểu tham chiếu (object, String...), toán tử
==chỉ kiểm tra xem hai biến có trỏ đến cùng một địa chỉ bộ nhớ hay không. - Để so sánh nội dung của đối tượng, bắt buộc phải dùng phương thức
equals(). Ví dụ:str1.equals(str2). Cần đảm bảo đối tượng gọi phương thức không bịnullđể tránh lỗi ngoại lệ.
Cấu Trúc Rẽ Nhánh Switch
Khi cần kiểm tra một biến dựa trên nhiều giá trị cụ thể, switch-case là lựa chọn tối ưu hơn nhiều câu if lồng nhau. Mỗi nhánh case tương ứng với một giá trị của biểu thức.
int menuChoice = 2;
switch (menuChoice) {
case 1:
System.out.println("Chọn món 1");
break;
case 2:
System.out.println("Chọn món 2");
break;
case 3:
System.out.println("Chọn món 3");
break;
default:
System.out.println("Lựa chọn không hợp lệ");
break;
}
Từ khóa break đóng vai trò thoát khỏi cấu trúc switch sau khi thực hiện xong nhánh phù hợp. Nếu thiếu break, chương trình sẽ tiếp tục thực thi các nhánh phía dưới (hiện tượng fall-through) cho đến khi gặp break hoặc hết switch.
Vòng Lặp While và Do-While
Hai cấu trúc này dùng để lặp lại khối lệnh khi điều kiện còn đúng. Điểm khác biệt chính nằm ở thời điểm kiểm tra điều kiện:
while: Kiểm tra điều kiện trước khi vào vòng lặp. Nếu điều kiện sai ngay từ đầu, khối lệnh bên trong có thể không被执行 lần nào.do...while: Thực thi khối lệnh ít nhất một lần, sau đó mới kiểm tra điều kiện để quyết định có lặp tiếp hay không.
Vòng Lặp For
Vòng lặp for thích hợp khi đã biết trước số lần lặp hoặc cần quản lý biến đếm. Cú pháp gồm ba phần: khởi tạo, điều kiện duy trì và bước nhảy.
for (int index = 0; index < 10; index++) {
// Thực thi logic
System.out.println("Index: " + index);
}
Biến đếm index được khởi tạo trước khi vòng lặp bắt đầu. Điều kiện index < 10 được kiểm tra trước mỗi lần lặp. Sau mỗi lần thực thi khối lệnh, biểu thức cập nhật index++ sẽ chạy. Cách viết này giúp tập trung logic đếm vào một dòng duy nhất.
Vòng Lặp For-Each
Đối với các mảng hoặc collection, vòng lặp enhanced for (for-each) giúp duyệt qua từng phần tử mà không cần quan tâm đến chỉ số. Biến trong vòng lặp sẽ lần lượt nhận giá trị của từng phần tử trong集合.
int[] dataPoints = {10, 20, 30, 40, 50};
for (int value : dataPoints) {
System.out.println("Giá trị: " + value);
}
Hạn chế của cấu trúc này là không thể truy cập trực tiếp vào chỉ số (index) của phần tử đang xét và khó khăn trong việc thay đổi giá trị phần tử trong mảng gốc durante quá trình duyệt.