Vòng Lặp While trong Java 🔄
🎯 Mục tiêu: Học cách sử dụng vòng lặp while để thực hiện các tác vụ lặp lại dựa trên điều kiện trong Java.
Giới thiệu 📝
Vòng lặp while là một cấu trúc điều khiển trong Java, được sử dụng khi bạn không biết chính xác số lần lặp cần thực hiện, nhưng biết điều kiện để tiếp tục lặp. Nó giúp code của bạn linh hoạt và thích ứng với các tình huống khác nhau.
💡 Fun Fact: Vòng lặp while được sử dụng rộng rãi trong các ứng dụng tương tác với người dùng, như menu chọn lựa hoặc đọc dữ liệu từ bàn phím.
1. Cú Pháp Cơ Bản ⚡
Vòng Lặp While Đơn Giản
int count = 0;
while (count < 5) {
System.out.println("Lần lặp thứ " + count);
count++;
}
Các Thành Phần
- Điều kiện:
count < 5
- Kiểm tra điều kiện trước mỗi lần lặp - Thân vòng lặp: Code trong dấu ngoặc nhọn
- Cập nhật điều kiện:
count++
- Cập nhật giá trị sau mỗi lần lặp
2. Các Biến Thể Của Vòng Lặp While 🔄
Vòng Lặp While Với Nhiều Điều Kiện
int x = 0;
int y = 10;
while (x < y && x < 5) {
System.out.println("x = " + x + ", y = " + y);
x++;
y--;
}
Vòng Lặp While Vô Hạn
while (true) {
// Code vô hạn
break; // Thoát vòng lặp
}
Vòng Lặp While Với Biến Boolean
boolean isRunning = true;
while (isRunning) {
// Code
isRunning = false; // Dừng vòng lặp
}
3. Vòng Lặp While Với Mảng 📦
Duyệt Mảng Một Chiều
int[] numbers = {1, 2, 3, 4, 5};
int index = 0;
while (index < numbers.length) {
System.out.println(numbers[index]);
index++;
}
Duyệt Mảng Nhiều Chiều
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int i = 0;
while (i < matrix.length) {
int j = 0;
while (j < matrix[i].length) {
System.out.print(matrix[i][j] + " ");
j++;
}
System.out.println();
i++;
}
4. Vòng Lặp While Với Collections 🎯
Duyệt ArrayList
ArrayList<String> names = new ArrayList<>();
names.add("John");
names.add("Jane");
names.add("Bob");
int index = 0;
while (index < names.size()) {
System.out.println(names.get(index));
index++;
}
Duyệt Với Iterator
ArrayList<String> names = new ArrayList<>();
names.add("John");
names.add("Jane");
names.add("Bob");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
5. Ví Dụ Thực Tế 🚀
Đọc Dữ Liệu Từ Bàn Phím
public class InputReader {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = 0;
System.out.println("Nhập các số (0 để kết thúc):");
while (true) {
int number = scanner.nextInt();
if (number == 0) {
break;
}
sum += number;
}
System.out.println("Tổng các số đã nhập: " + sum);
scanner.close();
}
}
Tìm Ước Số Chung Lớn Nhất
public class GCDCalculator {
public static void main(String[] args) {
int a = 48;
int b = 18;
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
System.out.println("Ước số chung lớn nhất: " + a);
}
}
Xử Lý Menu
public class MenuHandler {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\nMenu:");
System.out.println("1. Thêm sản phẩm");
System.out.println("2. Xem danh sách");
System.out.println("3. Thoát");
System.out.print("Chọn: ");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("Thêm sản phẩm");
break;
case 2:
System.out.println("Xem danh sách");
break;
case 3:
running = false;
break;
default:
System.out.println("Lựa chọn không hợp lệ");
}
}
scanner.close();
}
}
Quản Lý Kết Nối Mạng
public class NetworkManager {
public static void main(String[] args) {
boolean isConnected = false;
int retryCount = 0;
int maxRetries = 3;
while (!isConnected && retryCount < maxRetries) {
try {
System.out.println("Đang thử kết nối...");
// Giả lập kết nối mạng
Thread.sleep(1000);
isConnected = true;
System.out.println("Kết nối thành công!");
} catch (Exception e) {
retryCount++;
System.out.println("Lỗi kết nối. Lần thử " + retryCount);
}
}
if (!isConnected) {
System.out.println("Không thể kết nối sau " + maxRetries + " lần thử");
}
}
}
Xử Lý File
public class FileProcessor {
public static void main(String[] args) {
try {
File file = new File("data.txt");
Scanner scanner = new Scanner(file);
int lineCount = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("Dòng " + (++lineCount) + ": " + line);
}
scanner.close();
System.out.println("Tổng số dòng: " + lineCount);
} catch (FileNotFoundException e) {
System.out.println("Không tìm thấy file!");
}
}
}
6. Best Practices ✅
-
Đảm Bảo Điều Kiện Dừng
// Không nên
while (true) {
// Code không có điều kiện dừng
}
// Nên
boolean shouldContinue = true;
while (shouldContinue) {
// Code
shouldContinue = false; // Điều kiện dừng
} -
Cập Nhật Biến Điều Kiện
// Không nên
int count = 0;
while (count < 5) {
System.out.println(count);
// Quên tăng count
}
// Nên
int count = 0;
while (count < 5) {
System.out.println(count);
count++;
} -
Sử Dụng Break Khi Cần
while (true) {
// Code
if (someCondition) {
break; // Thoát vòng lặp
}
} -
Tránh Vòng Lặp Vô Hạn
// Không nên
while (true) {
// Code không có điều kiện dừng
}
// Nên
int maxAttempts = 100;
int attempts = 0;
while (attempts < maxAttempts) {
// Code
attempts++;
}
7. Lỗi Thường Gặp ⚠️
-
Vòng Lặp Vô Hạn
// Lỗi
while (true) {
System.out.println("Vô hạn");
// Không có điều kiện dừng
}
// Đúng
boolean running = true;
while (running) {
System.out.println("Chạy");
running = false; // Điều kiện dừng
} -
Quên Cập Nhật Biến Điều Kiện
// Lỗi
int count = 0;
while (count < 5) {
System.out.println(count);
// Quên tăng count
}
// Đúng
int count = 0;
while (count < 5) {
System.out.println(count);
count++;
} -
Điều Kiện Không Bao Giờ Thỏa Mãn
// Lỗi
int count = 5;
while (count < 5) { // count đã là 5
System.out.println(count);
count++;
}
// Đúng
int count = 0;
while (count < 5) {
System.out.println(count);
count++;
}
💡 Lời khuyên: Hãy thực hành với các ví dụ thực tế để hiểu rõ hơn về cách sử dụng vòng lặp while trong các tình huống khác nhau.
Tiếp Theo 🎯
Trong các bài học tiếp theo, chúng ta sẽ:
- Tìm hiểu về vòng lặp do-while
- Học cách sử dụng break và continue
- Thực hành với các ví dụ thực tế
- Tìm hiểu về vòng lặp for