Trong hướng dẫn này, chúng ta sẽ xem xét ngắn gọn những điểm tương đồng và khác biệt trong việc cấp phát bộ nhớ giữa các mảng Java và ArrayList tiêu chuẩn. Hơn nữa, chúng ta sẽ xem cách nối và chèn các phần tử trong một mảng và ArrayList
2. Mảng Java và ArrayList
Mảng Java là một cấu trúc dữ liệu cơ bản được cung cấp bởi ngôn ngữ. Ngược lại, ArrayList là một triển khai của giao diện List được hỗ trợ bởi một mảng và được cung cấp trong Java Collections Framework
2. 1. Truy cập và sửa đổi các phần tử
Chúng ta có thể truy cập và sửa đổi các phần tử mảng bằng cách sử dụng ký hiệu dấu ngoặc vuông
System.out.println[anArray[1]];
anArray[1] = 4;
Mặt khác, ArrayList có một tập hợp các phương thức để truy cập và sửa đổi các phần tử
int n = anArrayList.get[1];
anArrayList.set[1, 4];
2. 2. Kích thước cố định so với kích thước động
Cả mảng và ArrayList đều phân bổ bộ nhớ heap theo cách tương tự, nhưng điểm khác biệt là mảng có kích thước cố định, trong khi kích thước của ArrayList tăng động
Vì một mảng Java có kích thước cố định, chúng tôi cần cung cấp kích thước trong khi khởi tạo nó. Không thể tăng kích thước của mảng sau khi nó đã được khởi tạo. Thay vào đó, chúng ta cần tạo một mảng mới với kích thước đã điều chỉnh và sao chép tất cả các phần tử từ mảng trước đó
ArrayList là một triển khai mảng có thể thay đổi kích thước của giao diện Danh sách - nghĩa là ArrayList phát triển linh hoạt khi các phần tử được thêm vào nó. Khi số phần tử hiện tại [bao gồm cả phần tử mới được thêm vào ArrayList] lớn hơn kích thước tối đa của mảng bên dưới, thì ArrayList sẽ tăng kích thước của mảng bên dưới
Chiến lược tăng trưởng cho mảng bên dưới phụ thuộc vào việc triển khai ArrayList. Tuy nhiên, vì kích thước của mảng bên dưới không thể tăng lên một cách linh hoạt, nên một mảng mới được tạo và các phần tử mảng cũ được sao chép vào mảng mới
Hoạt động thêm có chi phí thời gian khấu hao không đổi. Nói cách khác, việc thêm n phần tử vào ArrayList cần O[n] thời gian
2. 3. Các loại phần tử
Một mảng có thể chứa các kiểu dữ liệu nguyên thủy cũng như không nguyên thủy, tùy thuộc vào định nghĩa của mảng. Tuy nhiên, một ArrayList chỉ có thể chứa các kiểu dữ liệu không nguyên thủy
Khi chúng ta chèn các phần tử có kiểu dữ liệu nguyên thủy vào một ArrayList, trình biên dịch Java sẽ tự động chuyển đổi kiểu dữ liệu nguyên thủy thành lớp bao bọc đối tượng tương ứng của nó
Bây giờ chúng ta hãy xem cách nối và chèn các phần tử trong mảng Java và ArrayList
3. Nối thêm một phần tử
Như chúng ta đã thấy, mảng có kích thước cố định
Vì vậy, để nối thêm một phần tử, trước tiên, chúng ta cần khai báo một mảng mới lớn hơn mảng cũ và sao chép các phần tử từ mảng cũ sang mảng mới tạo. Sau đó, chúng ta có thể nối thêm phần tử mới vào mảng vừa tạo này
Hãy xem cách triển khai nó trong Java mà không sử dụng bất kỳ lớp tiện ích nào
public Integer[] addElementUsingPureJava[Integer[] srcArray, int elementToAdd] {
Integer[] destArray = new Integer[srcArray.length+1];
for[int i = 0; i < srcArray.length; i++] {
destArray[i] = srcArray[i];
}
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}
Ngoài ra, lớp Arrays cung cấp một phương thức tiện ích copyOf[], hỗ trợ tạo một mảng mới có kích thước lớn hơn và sao chép tất cả các phần tử từ mảng cũ
int[] destArray = Arrays.copyOf[srcArray, srcArray.length + 1];
Khi chúng ta đã tạo một mảng mới, chúng ta có thể dễ dàng thêm phần tử mới vào mảng
destArray[destArray.length - 1] = elementToAdd;
Mặt khác, việc thêm một phần tử vào ArrayList khá dễ dàng
anArrayList.add[newElement];
4. Chèn một phần tử vào chỉ mục
Chèn thêm một phần tử vào một chỉ số cho trước mà không làm mất đi các phần tử đã thêm trước đó không phải là một công việc đơn giản trong mảng
Trước hết, nếu mảng đã chứa số phần tử bằng với kích thước của nó, thì trước tiên chúng ta cần tạo một mảng mới có kích thước lớn hơn và sao chép các phần tử sang mảng mới
Hơn nữa, chúng ta cần dịch chuyển tất cả các phần tử xuất hiện sau chỉ mục đã chỉ định sang phải một vị trí
public static int[] insertAnElementAtAGivenIndex[final int[] srcArray, int index, int newElement] {
int[] destArray = new int[srcArray.length+1];
int j = 0;
for[int i = 0; i < destArray.length-1; i++] {
if[i == index] {
destArray[i] = newElement;
} else {
destArray[i] = srcArray[j];
j++;
}
}
return destArray;
}
Tuy nhiên, lớp ArrayUtils cung cấp cho chúng ta một giải pháp đơn giản hơn để chèn các phần tử vào một mảng
int[] destArray = ArrayUtils.insert[2, srcArray, 77];
Chúng ta phải chỉ định chỉ mục mà chúng ta muốn chèn giá trị, mảng nguồn và giá trị để chèn
Phương thức insert[] trả về một mảng mới chứa số lượng phần tử lớn hơn, với phần tử mới ở chỉ mục đã chỉ định và tất cả các phần tử còn lại dịch chuyển một vị trí sang phải
Lưu ý rằng đối số cuối cùng của phương thức insert[] là một đối số biến, vì vậy chúng ta có thể chèn bất kỳ số lượng phần tử nào vào một mảng
Hãy sử dụng nó để chèn ba phần tử trong srcArray bắt đầu từ chỉ mục hai
________số 8Và các phần tử còn lại sẽ được dịch chuyển ba vị trí sang phải
Hơn nữa, điều này có thể đạt được một cách tầm thường đối với ArrayList
anArrayList.add[index, newElement];
ArrayList dịch chuyển các phần tử và chèn phần tử vào vị trí cần thiết
5. Phần kết luận
Trong bài viết này, chúng ta đã xem xét mảng Java và ArrayList. Hơn nữa, chúng tôi đã xem xét những điểm tương đồng và khác biệt giữa hai. Cuối cùng, chúng ta đã thấy cách nối và chèn các phần tử trong một mảng và ArrayList