Người viết: Ngô Công Tuyền - Học viên lớp Java 09
Email: tuyenemotion@gmail.com

1.Tổng quan.

Java Cho phép chúng ta tạo bảng với một kích thước cố định hoặc sử dụng lớp collection để làm những việc tương tự nhau. Trong chủ đề này, chúng ta xem xét sự khác nhau giữa dung lượng của ArrayList so với kích thước của một mảng. Chúng ta cũng đề cập tới các ví dụ về thời điểm khởi tạo dung lượng ArrayList cũng như những lợi ích cùng với bất lợi về mặt dụng bộ nhớ.

2.Ví dụ.

2.1. Kích thước của mảng.

Bây giờ, chúng ta hãy khởi tạo mảng với kích thước mảng bằng 100:

Integer[] array = new Integer[100]; 
System.out.println("Size of an array:" + array.length);

Ở đây, khi tạo ra 1 mảng với kích thước ban đầu là 100, kết quả sẽ trả về:
Size of an array:100

2.2. Dung lượng của ArrayList.

Ban đầu, chúng ta cũng tạo ra một ArrayList với dung lượng là 100 theo cách sau.

List<Integer> list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());

Kích thước của mảng trả về là 0:
Size of the list is :0
Sau đó, chúng ta thêm một phần tử vào mảng:

list.add(10);
System.out.println("Size of the list is :" + list.size());

Nó trả về kết quả:
Size of the list is :1

3.Kích thước của mảng và ArrayList.

Dưới đây là một số khác biệt chính giữa kích thước của mảng và dung lượng của ArrayList.

3.1. Khi sửa đổi kích thước của mảng.

Mảng được cố định kích thước: Khi khởi tạo mảng với kích thước bằng một giá trị int, nó không thể thay đổi kích thước. Kích thước và dung lượng của nó là như nhau
ArrayList không cố định kích thước và dung lượng: Kích thước logic của ArrayList của mảng thay đổi dựa trên việc thêm hoặc xóa các phần tử trong mảng. Điều này được quản lý riêng biệt với kích thước lưu trữ vật lý của nó.Thêm vào đó khi đến giới hạn kích thước mảng, nó tự động tăng dung lượng để chứa thêm các phần tử mới.

3.2. Cấp phát bộ nhớ cho mảng.

Bộ nhớ của mảng được cấp phát khi tạo. Khi chúng ta tạo ra một mảng, nó sẽ được cấp phát bộ nhớ dựa theo kích thước cũng như loại dữ liệu của phần tử. Nó khởi tạo giá trị null cho tất cả giá trị kiểu tham chiếu và các giá trị mặc định cho kiểu dữ liệu nguyên thủy.
Bộ nhớ của ArrayList được thay đổi khi mở rộng mảng. Khi chúng ta chỉ định kích thước trong lúc tạo ArrayList, nó sẽ cấp phát đủ bộ nhớ cho dung lượng đó, tuy nhiên kích thước logic của mảng vẫn bằng 0. Khi mở rộng mảng, một mảng mới với dung lượng lơn hơn sẽ được tạo và các giá trị sẽ được sao chép vào đó.
Chúng ta cần lưu ý rằng một ArrayList trống có kích thước bằng 0 và nó là một mảng chứa các tham chiếu đối tượng.
ArrayList Capacity

4.Khi nào cần khởi tạo ArrayList với dung lượng mặc định.

Chúng ta có thể khởi tạo dung lượng cho ArrayList, tuy nhiên điều này là không cần thiết. Tuy nhiên, trong một số trường hợp sau chúng ta có thể dùng:

4.1.Tạo một ArrayList kích thước lớn.

Sẽ là phù hợp hơn khi chúng ta khai báo một ArrayList với dung lượng khi chúng ta biết nó sẽ là một mảng kích thước lớn. Nó sẽ tiết kiệm một số bước khi chúng ta thêm phần tử vào mảng.
Thêm vào đó, nếu là một danh sách lớn, các hoạt động mở rông tự động mảng sẽ phân bổ nhiều bộ nhớ hơn mức cần thiết. Bởi vì số bộ nhớ được cấp tỷ lệ thuận với bộ nhớ ban đầu, vì thế mảng càng lớn càng phải thêm nhiều bộ nhớ hơn mỗi lần mở rộng.

4.2. Xây dựng nhiều mảng có kích thước nhỏ.

Tương tự, như một ArrayList lớn, chúng ta tạo ra một lượng lớn các ArrayList khi đã ước lượng được số phần tử là điều không cần thiết. Giả sử, ArrayList tự động cấp phát một bộ nhớ có kích thước là 10, trong khi chúng ta chỉ cần lưu trữ một lượng <5 . Như vậy, hơn 50% bộ nhớ sẽ bị lãng phí, điều này quan trọng khi chúng ta có một lượng lớn các mảng.

5.Sử dụng ArrayList hiệu quả.

ArrayList là một giải pháp tốt khi chúng ta xây dựng một vùng chứa linh hoạt và dễ dàng thao tác. Tuy nó tốn nhiều bộ nhớ hơn so với mảng tuy nhiên nó cung cấp nhiều phương thức để thao tác hơn.
Trong một số trường hợp, đặc biệt là khi thao tác với các dữ liệu nguyên thủy, một mảng sẽ là giải pháp nhanh và tốn ít bộ nhớ hơn.
Một Linkedlist sẽ là hiệu quả hơn khi chúng ta không cần truy cập theo index, nó tốn rất ít tài nguyên cho việc quản lý bộ nhớ.

6.Tổng kết.

Dựa vào mục đích sử dụng và các dữ liệu đầu vào, chúng ta có thể lựa chọn những cách lưu trữ mảng khác nhau. Bài viết này là sự so sánh giữa array và ArrayList và cách lưu trữ chúng trong bộ nhớ.
Bài viết tham khảo từ nguồn.
Các bài viết tham khảo : tại đây.
Nguồn code tại Github