Mảng một chiều trong Java
Mảng một chiều là cấu trúc dữ liệu cơ bản trong Java, cho phép lưu trữ một tập hợp các phần tử cùng kiểu dữ liệu trong một dãy liên tiếp.
1. Khai báo và khởi tạo mảng
Khai báo mảng
// Khai báo mảng số nguyên
int[] numbers;
// Khai báo mảng chuỗi
String[] names;
// Khai báo mảng số thực
double[] prices;
Khởi tạo mảng
// Khởi tạo với kích thước
int[] numbers = new int[5];
// Khởi tạo với giá trị
int[] numbers = {1, 2, 3, 4, 5};
// Khởi tạo sau khi khai báo
int[] numbers;
numbers = new int[5];
2. Truy cập phần tử mảng
Truy cập trực tiếp
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(numbers[0]); // In phần tử đầu tiên
System.out.println(numbers[numbers.length - 1]); // In phần tử cuối cùng
Duyệt mảng
// Sử dụng vòng lặp for
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
// Sử dụng vòng lặp for-each
for (int number : numbers) {
System.out.println(number);
}
3. Các thao tác cơ bản
Thêm phần tử
public class ArrayOperations {
public static int[] addElement(int[] arr, int element) {
int[] newArr = new int[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
newArr[arr.length] = element;
return newArr;
}
}
Xóa phần tử
public class ArrayOperations {
public static int[] removeElement(int[] arr, int index) {
int[] newArr = new int[arr.length - 1];
for (int i = 0, j = 0; i < arr.length; i++) {
if (i != index) {
newArr[j++] = arr[i];
}
}
return newArr;
}
}
Tìm kiếm phần tử
public class ArrayOperations {
public static int findElement(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1; // Không tìm thấy
}
}
4. Các phương thức tiện ích
Sắp xếp mảng
import java.util.Arrays;
public class ArraySorting {
public static void main(String[] args) {
int[] numbers = {5, 2, 8, 1, 9};
// Sắp xếp tăng dần
Arrays.sort(numbers);
// In mảng đã sắp xếp
System.out.println(Arrays.toString(numbers));
}
}
Sao chép mảng
import java.util.Arrays;
public class ArrayCopying {
public static void main(String[] args) {
int[] source = {1, 2, 3, 4, 5};
// Sao chép toàn bộ mảng
int[] copy1 = Arrays.copyOf(source, source.length);
// Sao chép một phần mảng
int[] copy2 = Arrays.copyOfRange(source, 1, 3);
// In kết quả
System.out.println(Arrays.toString(copy1));
System.out.println(Arrays.toString(copy2));
}
}
So sánh mảng
import java.util.Arrays;
public class ArrayComparison {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
// So sánh nội dung mảng
boolean areEqual = Arrays.equals(arr1, arr2);
System.out.println("Hai mảng có bằng nhau không? " + areEqual);
}
}
5. Ví dụ thực tế
Quản lý danh sách điểm số
public class GradeManager {
private double[] grades;
public GradeManager(int size) {
grades = new double[size];
}
public void addGrade(int index, double grade) {
if (index >= 0 && index < grades.length) {
grades[index] = grade;
}
}
public double getAverage() {
double sum = 0;
for (double grade : grades) {
sum += grade;
}
return sum / grades.length;
}
public double getHighestGrade() {
double max = grades[0];
for (double grade : grades) {
if (grade > max) {
max = grade;
}
}
return max;
}
}
Xử lý chuỗi ký tự
public class StringProcessor {
public static char[] stringToCharArray(String str) {
return str.toCharArray();
}
public static String charArrayToString(char[] chars) {
return new String(chars);
}
public static char[] reverseCharArray(char[] chars) {
char[] reversed = new char[chars.length];
for (int i = 0; i < chars.length; i++) {
reversed[i] = chars[chars.length - 1 - i];
}
return reversed;
}
}
6. Best Practices
-
Kiểm tra giới hạn mảng
// Không nên
int[] arr = new int[5];
arr[5] = 10; // ArrayIndexOutOfBoundsException
// Nên
int[] arr = new int[5];
if (index >= 0 && index < arr.length) {
arr[index] = 10;
} -
Sử dụng Arrays.toString() để in mảng
// Không nên
System.out.println(arr); // In địa chỉ bộ nhớ
// Nên
System.out.println(Arrays.toString(arr)); // In nội dung mảng -
Tối ưu hóa vòng lặp
// Không nên
for (int i = 0; i < arr.length; i++) {
// Truy cập arr.length nhiều lần
}
// Nên
int length = arr.length;
for (int i = 0; i < length; i++) {
// Truy cập length đã lưu
}
7. Lỗi thường gặp
-
ArrayIndexOutOfBoundsException
int[] arr = new int[5];
arr[5] = 10; // Lỗi: chỉ số nằm ngoài giới hạn -
NullPointerException
int[] arr;
System.out.println(arr.length); // Lỗi: mảng chưa được khởi tạo -
ArrayStoreException
Object[] arr = new Integer[5];
arr[0] = "Hello"; // Lỗi: không thể lưu String vào mảng Integer