"Tôi đây."

"Chào, Ellie!"

"Hôm nay chúng ta sẽ nói về một chủ đề thú vị. Tôi sẽ kể cho bạn nghe về lớp ArrayList ."

"Một lớp học mới? Tuyệt! Nó có thể làm gì?"

"Để tôi bắt đầu với câu chuyện phía sau. Điều duy nhất mà các lập trình viên không thích về mảng là bạn không thể thay đổi kích thước của chúng. Bạn sẽ làm gì nếu cần thêm ba phần tử nữa vào một mảng chỉ có một ô trống? "

"Giải pháp duy nhất cho vấn đề này là tạo các mảng rất lớn, để đảm bảo bạn có đủ chỗ cho tất cả các phần tử. Tuy nhiên, điều này thường đồng nghĩa với việc lãng phí bộ nhớ. Nếu một mảng thường chứa ba phần tử, nhưng có một cơ hội nhỏ nhất rằng nó có thể cần chứa 100 phần tử, bạn phải tạo một mảng 100 phần tử."

"Vậy, các lập trình viên đã nghĩ ra điều gì?"

"Họ đã viết lớp ArrayList , lớp này hoạt động tương tự như Array, nhưng nó có thể thay đổi kích thước của nó."

"Một động thái thú vị. Họ đã làm điều đó như thế nào?"

"Mọi đối tượng ArrayList lưu trữ một mảng các phần tử thông thường. Khi bạn đọc các phần tử từ ArrayList , nó sẽ đọc chúng từ mảng bên trong của nó. Khi bạn ghi chúng vào ArrayList , nó sẽ ghi chúng vào mảng bên trong của nó. Ở đây, hãy so sánh các cột này:"

Mảng Lập danh sách
Tạo vùng chứa cho các phần tử
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Lấy số phần tử
int n = list.length;
int n = list.size();
Lấy một phần tử từ một mảng/bộ sưu tập
String s = list[3];
String s = list.get(3);
Viết phần tử vào mảng
list[3] = s;
list.set(3, s);

"Vậy, tại sao ArrayList lại tốt hơn? Theo như tôi có thể nói, mã bây giờ dài hơn."

"Đầu tiên, ArrayList hỗ trợ một số thao tác bổ sung mà các lập trình viên phải thực hiện mọi lúc. Một mảng thông thường không hỗ trợ các thao tác này. Ví dụ: chèn hoặc xóa các phần tử từ giữa mảng mà không để lại lỗ. "

"Thứ hai, khả năng thay đổi kích thước của mảng. Khi bạn cần thêm một phần tử nữa nhưng mảng bên trong không có bất kỳ vị trí trống nào, đây là điều xảy ra bên trong ArrayList :

a) Một mảng khác được tạo lớn hơn 50% so với mảng bên trong hiện tại, cộng với một phần tử.

b) Tất cả các phần tử từ mảng cũ được sao chép vào mảng mới.

c) Mảng mới được lưu dưới dạng mảng bên trong của đối tượng ArrayList. Mảng cũ được tuyên bố là rác (chúng tôi chỉ cần ngừng lưu trữ tham chiếu đến nó)."

Mảng Lập danh sách
Thêm phần tử vào cuối mảng
Hành động này không được hỗ trợ
list.add(s);
Thêm phần tử vào giữa mảng
Hành động này không được hỗ trợ
list.add(15, s);
Thêm phần tử vào đầu mảng
Hành động này không được hỗ trợ
list.add(0, s);
Xóa một phần tử khỏi mảng
Chúng tôi có thể xóa một phần tử với list[3] = null. Nhưng điều này sẽ để lại một 'lỗ hổng' trong mảng.
list.remove(3);

"Làm thế nào để chúng tôi làm việc với ArrayList này?"

"Thực ra, giống như chúng ta làm với một mảng thông thường. Hãy nhìn xem. Hãy so sánh làm việc với ArrayList với làm việc với một mảng. Giả sử chúng ta cần ' đọc 10 chuỗi và hiển thị chúng trên màn hình theo thứ tự đảo ngược '."

"Hãy nhìn này:

Với một mảng
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Với một ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

Tôi đã sử dụng cùng một màu để làm nổi bật các hành động tương tự trong mỗi cột."

"Một mặt, mọi thứ đều khác. Mặt khác, nó vẫn vậy."

"Phải. Ngoại trừ việc chúng tôi không sử dụng dấu ngoặc vuông khi làm việc với ArrayList . Thay vào đó, chúng tôi sử dụng các phương thức get , setadd ."

"Vâng, tôi đã thu thập được nhiều như vậy. Tuy nhiên, nó trông rất giống nhau."