Khái niệm về mảng
Mảng là cấu trúc dữ liệu dùng để lưu trữ nhiều phần tử cùng kiểu dữ liệu. Đây là một mô hình lưu trữ quan trọng trong lập trình Java.
Các định nghĩa mảng
Có hai cách chính để khai báo mảng:
- Cách 1:
kiểu_dữ_liệu[] tên_biến, ví dụ:int[] danhSach - Cách 2:
kiểu_dữ_liệu tên_biến[], ví dụ:int danhSach[]
Khởi tạo mảng tĩnh
Khi khởi tạo tĩnh, bạn sẽ xác định giá trị ban đầu cho từng phần tử mảng:
public class MangTinh {
public static void main(String[] args) {
// Phương pháp 1
String[] tenNguoi = new String[]{"An", "Binh", "Cuong"};
// Phương pháp 2
String[] hoTen = {"An", "Binh", "Cuong"};
}
}
Khởi tạo mảng động
Khi khởi tạo động, bạn chỉ xác định độ dài mảng, hệ thống sẽ gán giá trị mặc định:
public class MangDong {
public static void main(String[] args) {
int[] mangSo = new int[5];
/*
Bên trái:
int: kiểu dữ liệu của phần tử trong mảng
[]: biểu thị đây là mảng
mangSo: tên mảng
Bên phải:
new: cấp phát bộ nhớ cho mảng
int: kiểu dữ liệu phần tử
[]: biểu thị mảng
5: độ dài mảng
*/
}
}
Giá trị mặc định của mảng
- Số nguyên: 0
- Số thực: 0.0
- Boolean: false
- Ký tự: '\u0000'
- Tham chiếu: null
Truy cập phần tử mảng
Sử dụng chỉ số (index) bắt đầu từ 0:
public class TruyCapMang {
public static void main(String[] args) {
int[] duLieu = {10, 20, 30, 40, 50};
// Lấy giá trị tại vị trí thứ 3
int giaTri = duLieu[3];
System.out.println(giaTri);
// Thay đổi giá trị tại vị trí thứ 3
duLieu[3] = 100;
System.out.println("Sau khi thay đổi: " + duLieu[3]);
}
}
Duyệt mảng
Sử dụng vòng lặp để truy cập tất cả phần tử:
public class DuyetMang {
public static void main(String[] args) {
int[] mang = {5, 10, 15, 20, 25};
for(int chiSo = 0; chiSo < mang.length; chiSo++) {
System.out.println(mang[chiSo]);
}
}
}
Lỗi phổ biến với mảng
Khi truy cập chỉ số không tồn tại sẽ gây ra ngoại lệ IndexOutOfBoundsException:
public class LoiMang {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[0]); // Hợp lệ
System.out.println(arr[10]); // Gây lỗi
}
}
Phương thức trong Java
Phương thức là khối mã có chức năng riêng biệt, được tổ chức thành đơn vị có thể tái sử dụng.
Định nghĩa và gọi phương thức
public class PhuongThuc {
public static void main(String[] args) {
kiemTraChanLe(); // Gọi phương thức
}
public static void kiemTraChanLe() {
int so = 8;
if(so % 2 == 0) {
System.out.println("Là số chẵn");
} else {
System.out.println("Là số lẻ");
}
}
}
Phương thức có tham số
Cú pháp khai báo:
- Tham số đơn:
public static void tenPhuongThuc(kiểu_dữ_liệu tên_biến) - Nhiều tham số:
public static void tenPhuongThuc(kiểu_dữ_liệu biến1, kiểu_dữ_liệu biến2)
Trọng tải phương thức (Overloading)
Cho phép nhiều phương thức cùng tên nhưng khác nhau về số lượng hoặc kiểu tham số:
public class TrongTai {
public static int congHaiSo(int a, int b) {
return a + b;
}
public static double congHaiSo(double a, double b) {
return a + b;
}
public static int congBaSo(int a, int b, int c) {
return a + b + c;
}
}
Phân bổ bộ nhớ trong Java
Java quản lý bộ nhớ qua các vùng chính:
- Ngăn xếp (Stack): Lưu biến cục bộ, hoạt động khi phương thức chạy
- Heap: Lưu trữ đối tượng và mảng được tạo bằng từ khóa new
- Vùng phương thức: Lưu trữ file class có thể thực thi
Truyền tham số vào phương thức
Loại dữ liệu cơ bản: Truyền giá trị thực tế, không ảnh hưởng đến tham số gốc.
Loại dữ liệu tham chiếu: Truyền địa chỉ bộ nhớ, thay đổi ảnh hưởng đến dữ liệu gốc.