ArrayList là lớp extends từ AbstractList và implement từ List interface. Nó được sử dụng rất rộng rãi bởi các chức năng và tính linh hoạt mà nó cung cấp. Hầu hết các Java Developers đều chọn sử dụng ArrayList thay vì sử dụng Array thông thường.
ArrayList trong Java

Điểm bất lợi của Array trong Java đó chính là chiều dài bị cố định. Sau khi chúng được tạo thì không thể mở rộng ra hay co hẹp lại. Điều đó có nghĩa rằng chúng ta phải biết trước Array này sẽ có bao nhiêu phần tử sẽ được lưu trữ bởi nó.

Trong khi đó, ArrayList cho phép chúng ta linh động hơn khi làm việc. Nó có thể được tạo ra với kích thước ban đầu nào đó. Nhưng khi kích thước này bị vượt quá thì collection sẽ tự động được mở rộng ra. Khi các object được xóa ra khỏi collection thì nó sẽ được co lại.

Phương thức khởi tạo

#No.Constructor & Description
#1ArrayList()
Constructor này sẽ tạo ra một array list rỗng.
#2ArrayList(Collection c)
Constructor này sẽ tạo ra một ArrayList mà được khởi tạo với các phần tử của collection c.
#3ArrayList(int capacity)
Khi sử dụng contructor này, bạn sẽ tạo ra được một ArrayList với một sức chứa cụ thể ban đầu được quy định. Capacity là kích thước cơ bản của mảng dùng để chứa các phần tử của nó. Kích thước của Arraylist sẽ tự động phình lên khi bạn thêm càng nhiều các phần tử vào.

Các phương thức hỗ trợ

Dưới đây là một số phương thức của ArrayList được định nghĩa sẵn mà bạn có thể sủ dụng.
#No.Method & Description
#1 void add(int index, Object element)
Thêm một phần tử mới vào vị trí cụ thể của danh sách. Ngoại lệ IndexOutOfBoundsException sẽ được ném ra nếu như bạn truyền vào index vượt ra khỏi phạm vi (index < 0 || index > size()).
#2 void add(Object element)
Thêm một phần tử mới vào vị trí cuối cùng của danh sách
#3 boolean addAll(Collection c)
Thêm vào các phần tử có trong collection c vào cuối danh sách. Ngoại lệ NullPointerException sẽ được ném ra nếu như Collection c truyền vào là null.
#4 boolean addAll(int index, Collection c)
Tương tự như addAll, phương thức này thêm vào các phần tử có trong collection c vào vị trí index cụ thể trong ArrayList. Ngoại lệ NullPointerException sẽ được ném ra nếu như Collection c truyền vào là null.
#5 void clear()
Xóa toàn bộ các phần tử có trong trong danh sách.
#6 Object clone()
Trả về shallow copy của ArrayList hiện tại.
#7 boolean contains(Object o)
Trả về true nếu như danh sách có chứa phần từ bằng với object o. Chính xác hơn, nó sẽ trả về true nếu và chỉ nếu danh sách có chứa ít nhất 1 phần tử e mà nó thỏa mãn biểu thức (o == null? e == null : o.equals(e)).
#8 Object get(int index)
Trả về phần tử ở vị trí index trong danh sách. Ngoại lệ IndexOutOfBoundsException sẽ được ném ra nếu như index truyền vào vượt quá phạm vi lưu trữ (index < 0 || index >= size())
#9 int indexOf(Object o)
Trả về vị trí index của Object o được tìm thấy đầu tiên trong danh sách. Hoặc sẽ trả về -1 nếu như không tìm thấy.
#10 int lastIndexOf(Object o)
Trả về vị trí index cuối cùng mà Object o xuất hiện trong danh sách, ngược lại trả về -1 nếu không tìm thấy bất kỳ phần tử nào.
#11 Object remove(int index)
xóa bỏ phần từ tại vị trí index trong danh sách. Ngoại lệ IndexOutOfBoundsException sẽ được ném ra nếu như index truyền vào vượt quá phạm vi lưu trữ.
#12 Object set(int index, Object o)
Thay thế phần tử tại ví trí index bằng Object o. Ngoại lệ IndexOutOfBoundsException sẽ được ném ra nếu như index truyền vào vượt quá phạm vi lưu trữ.
#13 int size()
Trả về số lượng phần tử có trong danh sách
#14 Object[] toArray()
Trả vể một mảng bao gồm các đối tượng có trong danh sách với thứ tự đúng như trên ArrayList.
...một số phương thức khác các bạn có thể tìm hiểu thêm từ trang chủ của Oracle

Ví dụ minh họa

Để giúp các bạn nắm bắt được cách sử dụng các phương thức mà ArrayList trong Java đã hỗ trợ thì dưới đây tôi có viết một đoạn chương trình minh họa để các bạn xem. Tôi sẽ chú thích và sử dụng các phương thức mà tôi đã liệt kê ở trên.

package com.vanthuong.example;

import java.util.ArrayList;

/**
 * Official blog: http://www.vanthuong.com
 * Learn and share your java knowledge
 */
public class ArrayListExample {
  public static void main(String[] args) {
    // Tạo mới Array List
    ArrayList<String> names = new ArrayList<>();
    System.out.println("Initial size of names: " + names.size());

    // Thêm mới các phần tử
    names.add("Phuc");
    names.add("Loc");
    names.add("Tho");
    names.add("Nga");
    names.add("Ngan");
    names.add("Phuc");
    names.add("Thuong");
    names.add(1, "Phuc 2");
    System.out.println("Size of names after added more elements: " + names.size());

    // Hiển thị các phần tử có trong danh sách mảng
    System.out.println("Contents of names: " + names);

    // Sử dụng addAll(Collection c)
    ArrayList<String> secondNames = new ArrayList<>();
    secondNames.add("ABC");
    secondNames.add("DEF");

    names.addAll(secondNames);
    System.out.println("Contents of names: " + names);

    // Sử dụng addAll(int index, Collection c)
    names.addAll(1, secondNames);
    System.out.println("Contents of names: " + names);

    // Cách dùng clone()
    Object clonedObject = names.clone();
    System.out.println("Content of clonedObject " + clonedObject);

    // Sử dụng remove(index)
    names.remove(names.size() - 1);
    names.remove(names.size() - 1);
    names.remove(2);
    names.remove(1);
    System.out.println("Contents of names: " + names);

    // Method contains(Object o)
    System.out.println("Is names contains 'Phuc': " + names.contains("Phuc"));

    // Method get(int index)
    System.out.println("names.get(0) =\"Phuc\"' => " + names.get(0));

    System.out.println("Get first indexOf(\"Phuc\") : " + names.indexOf("Phuc"));

    System.out.println("Get last indexOf(\"Phuc\") : " + names.lastIndexOf("Phuc"));

    // method set(int index, Object o)
    names.set(1, "Thuong 2");
    System.out.println("Contents of names : " + names);

    // toArray();
    Object[] nameArr = names.toArray();
    for (Object name : nameArr) {
      System.out.println("name = " + name.toString());
    }
  }
}

Biên dịch và chạy chương trình sẽ in ra kết quả như sau:
Initial size of names: 0
Size of names after added more elements: 8
Contents of names: [Phuc, Phuc 2, Loc, Tho, Nga, Ngan, Phuc, Thuong]
Contents of names: [Phuc, Phuc 2, Loc, Tho, Nga, Ngan, Phuc, Thuong, ABC, DEF]
Contents of names: [Phuc, ABC, DEF, Phuc 2, Loc, Tho, Nga, Ngan, Phuc, Thuong, ABC, DEF]
Content of clonedObject [Phuc, ABC, DEF, Phuc 2, Loc, Tho, Nga, Ngan, Phuc, Thuong, ABC, DEF]
Contents of names: [Phuc, Phuc 2, Loc, Tho, Nga, Ngan, Phuc, Thuong]
Is names contains 'Phuc': true
names.get(0) ="Phuc"' => Phuc
Get first indexOf("Phuc") : 0
Get last indexOf("Phuc") : 6
Contents of names : [Phuc, Thuong 2, Loc, Tho, Nga, Ngan, Phuc, Thuong]
name = Phuc
name = Thuong 2
name = Loc
name = Tho
name = Nga
name = Ngan
name = Phuc
name = Thuong