openplanning

Hướng dẫn và ví dụ Java ArrayList

  1. ArrayList
  2. ArrayList lưu trữ các phần tử như thế nào?
  3. Examples

1. ArrayList

ArrayList là một lớp thi hành interface List và hỗ trợ tất cả các tính năng của List bao gồm cả các tính năng tuỳ chọn. Về cơ bản ArrayList quản lý một mảng để lưu trữ các phần tử của nó, mảng này có thể được thay thế bởi một mảng khác có độ dài lớn hơn nếu số phần tử của ArrayList tăng lên.
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Dưới đây là các đặc điểm của ArrayList:
  • ArrayList cho phép chứa các phần tử trùng lặp và các phần tử null.
  • ArrayList duy trì thứ tự chèn của các phần tử.
  • ArrayList là không đồng bộ (non synchronized) vì vậy nó cần được đồng bộ hoá để có thể sử dụng trong môi trường Multithreading (đa luồng).
  • ArrayList cho phép truy cập ngẫu nhiên vào các phần tử dựa trên chỉ số.
  • Thao tác trong ArrayList chậm hơn một chút so với LinkedList (Xem thêm giải thich trong phần nguyên tắc hoạt động của ArrayList).
ArrayList khá giống với Vector, ngoại trừ nó là không đồng bộ. Trong môi trường Multithreading nó nên được gói (wrapped) bằng cách sử dụng phương thức Collections.synchronizedList.
ArrayList<String> arrayList = new ArrayList<String>();
        
List<String> syncList = Collections.synchronizedList(arrayList);
CopyOnWriteArrayList là một biến thể an toàn theo luồng (thread-safe) của ArrayList mà bạn có thể cân nhắc sử dụng:
ArrayList constructors:
ArrayList()
Tạo một đối tượng ArrayList rỗng với mảng nội bộ có sức chứa ban đầu là 10 phần tử.
ArrayList(Collection<? extends E> c)
Tạo một đối tượng ArrayList chứa tất cả các phần tử của Collection chỉ định, thứ tự của các phần tử được quyết định bởi Iterator của Collection.
ArrayList(int initialCapacity)
Tạo một đối tượng ArrayList rỗng với mảng nội bộ có sức chứa ban đầu chỉ định.

2. ArrayList lưu trữ các phần tử như thế nào?

ArrayList quản lý một mảng các đối tượng, tất cả các hành động thêm, chèn hoặc loại bỏ một phần tử ra khỏi ArrayList sẽ tạo ra hành động gán (hoặc cập nhập) giá trị cho các phần tử khác của mảng, nó có thể ảnh hưởng tới nhiều phần tử của mảng.
arrayList.add(X)
Khi bạn thêm một phần tử vào ArrayList, nó sẽ được gán vào một phần tử của mảng tại chỉ số arrayList.size().
arrayList.add(idx,X)
Khi bạn trèn một phần tử vào ArrayList, nhiều phần tử trên mảng sẽ phải cập nhập lại giá trị.
arrayList.remove(idx)
Loại bỏ một phần tử tại chỉ số idx ra khỏi ArrayList cũng làm cho nhiều phần tử của mảng phải cập nhập lại giá trị mới.
ArrayList sẽ thay thế mảng mà nó quản lý bằng một mảng mới có độ dài lớn hơn nếu số lượng phần tử được thêm vào lớn hơn độ dài của mảng hiện tại.

3. Examples

Ví dụ, sử dụng ArrayList trong môi trường Multithreading:
ArrayList_sync.java
package org.o7planning.arraylist.ex;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayList_sync {

    public static void main(String[] args) throws InterruptedException {
        new ArrayList_sync();
    }
    
    public ArrayList_sync() throws InterruptedException {
         ArrayList<String> arrayList = new ArrayList<String>();
         
         List<String> syncList = Collections.synchronizedList(arrayList);
          
         ThreadA threadA = new ThreadA(syncList);
         ThreadB threadB = new ThreadB(syncList);
         
         threadA.start();
         threadB.start();
         
         threadA.join();
         threadB.join();
         
         for(String s: syncList)  {
             System.out.println(s);
         }
    }
    
   class ThreadA extends Thread {
        private List<String> list;
        public ThreadA(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("A "+ i);
            }
        }
    }
    
    class ThreadB extends Thread {
        private List<String> list;
        public ThreadB(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("B "+ i);
            }
        }
    }
}
Output:
...
A 938
B 898
A 939
B 899
A 940
B 900
A 941
B 901
A 942
...
ArrayList hỗ trợ tất cả các tính năng được đặc tả trong interface List bao gồm cả các tính năng tuỳ chọn. Bạn có thể tìm thấy các ví dụ tốt nhất về ArrayList trong bài viết dưới đây:

Các hướng dẫn Java Collections Framework

Show More