1. ArrayListlớp học

Hôm nay chúng ta sẽ khám phá ArrayListlớp học. Đây là lớp đầu tiên trong một số lớp được gọi là bộ sưu tập . Trong Java, các bộ sưu tập là một chủ đề rộng lớn và hữu ích đến mức toàn bộ nhiệm vụ CodeGym được dành cho chúng.

Để hiểu đầy đủ cách các bộ sưu tập được cấu trúc và tất cả các sắc thái của chúng, trước tiên bạn cần tìm hiểu OOP, giao diện, kế thừa, kiến ​​thức cơ bản về đa luồng, v.v.

Vì vậy, hôm nay chúng ta sẽ chỉ làm quen với một loại tập hợp đơn giản nhất. Nhưng ở mức độ đủ sâu để bạn hiểu cách sử dụng và cách thức hoạt động của nó. Bây giờ, hãy gặp ArrayListbộ sưu tập .

cốt truyện

Tôi sẽ bắt đầu với một nền tảng nhỏ. Các lập trình viên thực sự không thích một khía cạnh của mảng: thực tế là kích thước của chúng không thể thay đổi được. Điều gì sẽ xảy ra nếu bạn cần lưu trữ thêm ba phần tử trong một mảng nhưng chỉ có một ô trống?

Giải pháp duy nhất cho giới hạn không gian của một mảng là tạo một mảng rất lớn để chứa tất cả các phần tử mà bạn có thể cần lưu trữ. Nhưng điều này thường là một sự lãng phí bộ nhớ. Nếu một mảng thường chứa hai hoặc ba phần tử nhưng thậm chí có khả năng rất nhỏ là nó cần lưu trữ 100 phần tử trong số đó, thì cần phải tạo một mảng có khả năng lưu trữ 100 phần tử.

Vậy các lập trình viên đã nghĩ ra điều gì? Họ đã viết ArrayListlớp, lớp này thực hiện công việc tương tự như Arraylớp, nhưng có thể thay đổi kích thước.

lớp ArrayList

Tên của ArrayListlớp được hình thành từ hai từ: Mảng + Danh sách. Arraylà một mảng và Listlà một danh sách.

Mỗi ArrayListđối tượng chứa một mảng các phần tử bình thường. Khi bạn đọc các phần tử từ một ArrayList, đối tượng sẽ truy xuất chúng từ mảng bên trong của nó. Khi bạn viết các phần tử, nó sẽ ghi chúng vào mảng bên trong.

Lớp ArrayList thiếu tất cả những nhược điểm mà mảng có. Nó biết cách:

  • Lưu trữ các phần tử của một loại cụ thể
  • Tự động thay đổi kích thước danh sách
  • Thêm phần tử vào cuối danh sách
  • Chèn phần tử vào đầu hoặc giữa danh sách
  • Xóa các phần tử khỏi bất kỳ đâu trong danh sách

Để biết thêm chi tiết, xem bên dưới:


2. Tạo ArrayListđối tượng

Để tạo một ArrayListđối tượng, bạn cần viết mã như sau:

ArrayList<TypeParameter> name = new ArrayList<TypeParameter>();

ArrayListLoại/lớp của bộ sưu tập ở đâu , TypeParameterlà loại của các phần tử được lưu trữ trong ArrayListbộ sưu tập và namelà tên của một ArrayList<TypeParameter>biến.

Biến namecó một loại chung. Nó bao gồm hai loại: loại bộ sưu tập được chỉ định trước, sau đó dấu ngoặc nhọn được sử dụng để chỉ loại phần tử được lưu trữ trong bộ sưu tập.

Ví dụ:

Mã số Sự miêu tả
ArrayList<Integer> list = new ArrayList<Integer>();
Danh sách các số nguyên
ArrayList<String> list = new ArrayList<String>();
Danh sách các chuỗi
ArrayList<Double> list = new ArrayList<Double>();
Danh sách các số thực

Không giống như mảng, các bộ sưu tập không thể lưu trữ các kiểu nguyên thủy, chỉ lưu trữ các kiểu tham chiếu . Vì vậy, nếu bạn cần một bộ sưu tập intcác s, Integerthay vào đó hãy sử dụng lớp trình bao bọc.


3. Hoạt động với mộtArrayList

Ban đầu, độ dài của danh sách mới được tạo bằng 0, vì nó chứa 0 phần tử. Nếu bạn thêm một phần tử vào danh sách, độ dài của nó sẽ tăng thêm 1. Nếu bạn xóa phần tử đã thêm, độ dài sẽ giảm về 0.

Bảng sau đây có thể cho bạn biết thêm về các phương thức của lớp ArrayList:

phương pháp Sự miêu tả
void add(Type value)
Thêm phần tử đã truyền vào danh sách
void add(int index, Type value)
Thêm một phần tử vào một vị trí cụ thể trong danh sách.
Type get(int index)
Trả về phần tử có chỉ số làindex
void set(int index, Type value)
Gán valuecho phần tử có chỉ số làindex
Type remove(int index)
Loại bỏ phần tử có chỉ số là index. Trả về phần tử đã loại bỏ.
Type remove(Type value)
Loại bỏ phần tử mà bạn truyền vào phương thức. Nếu có nhiều hơn một phần tử như vậy, phần tử đầu tiên sẽ bị xóa.
void clear()
Xóa danh sách, nghĩa là xóa tất cả các phần tử khỏi danh sách.
boolean contains(Type value)
Kiểm tra xem danh sách có chứa value.
boolean isEmpty()
Kiểm tra xem danh sách có rỗng hay không. Nói cách khác, độ dài của danh sách có bằng không hay không.
int size()
Trả về kích thước của danh sách, tức là số phần tử trong danh sách.
Type[] toArray(Type[] array)
Trả về một mảng chứa các phần tử của danh sách.
Bạn cần truyền mảng cho phương thức.

Các phương thức này cho phép bạn thực hiện hầu hết mọi thứ bạn muốn với danh sách: hoán đổi phần tử, thêm phần tử và xóa phần tử. Bạn có thể xóa danh sách bằng một lệnh hoặc thậm chí chuyển đổi danh sách thành một mảng.



4. So sánh ArrayListArray

Tôi không nghĩ rằng chúng ta có thể tránh so sánh ArrayListvà một mảng.

Chỉ có 4 hành động bạn có thể thực hiện với mảng:

  • Tạo một mảng
  • Nhận một phần tử theo chỉ mục
  • Đặt một phần tử theo chỉ mục
  • Lấy độ dài của mảng

Dưới đây là các thao tác này khi chúng áp dụng cho một mảng và một ArrayList:

Mảng Lập danh sách
String[] array = new String[10];
ArrayList<String> list = new  ArrayList<String>();
String s = array[0];
String s = list.get(0);
array[0] = "Bye";
list.set(0, "Bye");
int count = array.length;
int count = list.size();

Hãy so sánh cách thức ArrayListhoạt động của một mảng so với cách thức hoạt động của một mảng. Ví dụ: hãy thực hiện tác vụ này: "đọc 10 chuỗi từ bàn phím và hiển thị chúng trên màn hình theo thứ tự ngược lại"

Sử dụng mảng Sử dụng ArrayList
Scanner console = new Scanner(System.in);

// Read strings from the keyboard
String[] list = new String[10];

for (int i = 0; i < list.length; i++)
{
    String s = console.nextLine();
    list[i] = s;
}

// Display the contents of the array on the screen
for (int i = 0; i < list.length; i++)
{
    int j = list.length - i - 1;
    System.out.println(list[j]);
}
Scanner console = new Scanner(System.in);

// Read strings from the keyboard
ArrayList<String> list = new ArrayList<String>();

for (int i = 0; i < 10; i++)
{
    String s = console.nextLine();
    list.add(s);
}

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

Sự tương tự là rõ ràng. Mọi thứ bằng cách nào đó ngắn hơn và rõ ràng hơn đối với mảng. Nhưng ArrayListcũng không khó: để lấy một phần tử, chúng ta sử dụng get()phương thức; để thay đổi một phần tử, set()phương thức; để lấy độ dài của danh sách, size()phương thức.

Vậy tại sao các lập trình viên sử dụng ArrayListlớp?

Tất nhiên, toàn bộ vấn đề là tất cả các phương thức khác mà các mảng thông thường không có:

  • Thêm một phần tử vào danh sách
  • Thêm phần tử vào giữa danh sách
  • Tìm một phần tử trong danh sách
  • Xóa một phần tử khỏi danh sách