Các Collection (Set, List, Map, ArrayList, Vector, HashTable, HashSet, HashMap) được đặt trong gói java.util là một kiến trúc hợp nhất để biểu diễn và thao tác trên các nhóm đối tượng.
Lợi ích của Collection Framework:
- Giảm bớt thời gian lập trình.
- Tăng cường hiệu năng chương trình.
- Dễ mở rộng các collection mới.
- Khuyến khích sử dụng lại mã của chương trình.
Các giao diện (interfaces) và các các lớp sưu tập (Collection class)
Giao diện List định nghĩa một sưu tập các phần tử Object có thể dẫn hướng.
Giao diện Set định nghĩa một sưu tập không có phần tử trùng lặp.
Giao diện Map định nghĩa một sưu tập các cặp khóa-giá trị.
Giao diện (interface) ==> Triển khai thực hiện (implementations).
List ==> ArrayList, Vector.
Set ==> HashSet, TreeSet.
Map ==> HashMap.
Các thao tác trên Collection.
Các phương thức để mô tả kích thước của collection (như size() và isEmpty()).
Các phương thức để mô tả nội dung của collection (như contains() và containsAll()).
Các phương thức để hỗ trợ thao tác về nội dung của collection (như add(), remove() và clear()).
Các phương thức để cho phép bạn chuyển đổi một collection thành một mảng (như toArray()).
Một phương thức để cho phép bạn nhận được một trình vòng lặp (iterator) trên mảng các phần tử (iterator()).
1/ List
Giao diện List là phần mở rộng của Collection Interface. Nó định nghĩa tập hợp các dữ liệu được sắp xếp và cho phép các phần tử trùng lắp được thêm vào.
Giao diện List sử dụng index cho việc sắp xếp các phần tử trong khi lưu trữ nó trong danh sách (list). List cung cấp cho chúng ta một vài phương thức sau để truy cập vào các phần tử:
add (Object o): thêm phần tử vào List.
add (int index, Object o): thêm phần tử vào và chỉ rõ vị trí trong List
addAll (int index, Collection c): thêm một toàn bộ phần tử của một collection và chỉ rõ vị trí bắt đầu.
get (int index): lấy phần tử tại vị trí đã được chỉ rõ.
set (int index, Object o): thay thế phần tử trong list được chỉ rõ vị trí.
remove (int index): xóa phần tử trong list tại vị trí index.
remove (Object o): xóa phần tử trong list được chỉ rõ tên.
subList ( int start, int end): phương thức này trả về kiểu List chứa tất cả các phần tử mà nó lấy được bắt đầu từ start và kết thúc tại end. Tôi thường dùng phương thức này để tạo ra List mới…
Ví dụ:
public static void main(String[] args) {
// TODO code application logic here
List list = new ArrayList();
//Thêm các phần tử vào list
list.add(“A”);
list.add(“B”);
list.add(“C”);
list.add(7);
list.add(8);
list.add(9);
System.out.println(list); // in ra [A, B, C, 7, 8, 9]
// thêm phần tử O tại ví trị 0.
list.add(0, “O”);
System.out.println(list); // in ra [O, A, B, C, 7, 8, 9]
// thêm M vào vị trí O
list.set(0, “M”);
System.out.println(list); // in ra [M, A, B, C, 7, 8, 9].
System.out.println(list.get(1)); // in ra phần tử A
// xóa phần tử M tại vị trí 0.
list.remove(0);
System.out.println(list); // in ra [A, B, C, 7, 8, 9].
}
2/ ArrayList
Việc sử dụng mảng (array) có một vài nhược điểm mà các lập trình viên thường gặp phải như sau:
Nếu khai báo kích thước mảng quá nhỏ thì sẽ dẫn đến thiếu bộ nhớ khi lưu trữ.
Nếu khai báo lớn thì thừa bộ nhớ (quá lãng phí).
Các phần tử trong mảng lại có cùng kiểu dữ liệu.
ArrayList đã tránh những nhược điểm này. ArrayList là một mảng động. Nếu các phần tử thêm vào vượt qua kích cỡ mảng, thì mảng sẽ tự động tăng kích cỡ. Từ Java 5.0 trở đi ArrayList lag một lớp generic ArrayList <T>.Vậy thì khi nào chúng ta dùng nó??? ArrayList nên dùng khi có nhu cầu truy cập các phần từ của list theo thứ tự ngẫu nhiên. Ví dụ truy cập phần từ thứ 1, rồi đến thứ 5, rồi quay lại thứ 3.
Các phương thức khởi tạo của lớp này:
ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)
Một vài phương thức cơ bản: ArrayList thừa kế tất cả các phương thức của giao diện List.
add( E object ) thêm phần tử vào vị trí cuối cùng của list.
trimToSize() cắt kích thước của ArrayList về kích thước hiện tại của ArrayList.
clear() xóa toàn bộ phần tử trong list.
contain() trả về giá trị true nếu list có chứa phần tử được chỉ rõ.
size() trả về số lượng phần tử trong list.
……………………………………………………………………………………………
Ví dụ:
public static void main(String[] args) {
List<String> objList = new ArrayList<String>();
System.out.println(objList.size());// sẽ in ra số 0.
objList.add(“A”);
objList.add(“B”);
objList.add(“C”);
objList.add(“D”);
objList.add(“E”);
objList.add(“F”);
System.out.println(objList.size()); // sẽ in ra số 6. vì lúc này đã có 6 phần tử thêm vào.
System.out.println(objList.contains(“A”)); // sẽ in ra true
System.out.println(“hãy khám phá thêm nhé…”);
}
3/ Vector
Lớp vector tương tự như ArrayList và nó cũng thực thi các mảng động. Lớp vector lưu mảng các đối tượng và kích thước của mảng này có thể tăng hoặc giảm. Chúng ta có thể truy cập các phần tử của Vector bằng cách sử dụng vị trí của phần tử đó.
Sự khác nhau giữa Vector và ArrayList là các phương thức của Vector dùng cơ chế đồng bộ (synchronised) và thread-safe. Cho nên Vector thường chạy chậm, các phương thức của ArrayList chạy nhanh hơn.
Các phương thức khởi tạo của Vector là:
Vector()
Vector(Collection c)
Vector (int initialCapacity)
Vector
(int initialCapacity, int capacityIncrement)
Các phương thức cơ bản của lớp này:
addElement(Object obj) phương thức này thêm phần tử vào vị trí cuối cùng của Vector và kích thước của Vector sẽ tăng lên 1.
insertElementAt(Object obj, int index) chèn một phần tử tại một vị trí xác định.
setElementAt(Object obj, int index) đặt giá trị cho một phần tử tại một vị trí
toArray() phương thức này trả về một mảng chứa tất cả các phần tử trong Vector.
elementAt(int pos) lấy một đối tượng được lưu trữ được xác định bởi vị trí.
removeElement(Object obj) xóa một phần tử xuất hiện đầu tiên trong Vector có giá trị bằng với Object.
Ví dụ:
public static void main(String[] args) {
Vector<Object> objVec = new Vector<Object>();
objVec.addElement(new Integer(1));
objVec.addElement(new Integer(2));
objVec.addElement(new Integer(3));
objVec.addElement(new Integer(4));
System.out.println(objVec); // [1, 2, 3, 4]
System.out.println(objVec.capacity()); // 10
System.out.println(objVec.size()); // 4
objVec.removeElement(3);
System.out.println(objVec); // [1, 2, 4]
}
4/ LinkedList
LinkedList là một danh sách liên kết hai chiều. Việc truy cập các phần tử phải theo tuần tự. Các phần tử trong linkedlist được lưu trữ như là những link riêng biệt. Nó cung cấp cho chúng ta một danh sách dữ liên liên kết với nhau. Nhìn hình sau:
Khi có một phần tử bất kì bị remove: Tôi remove Bob nhé:
Các phương thức khởi tạo của LinkedList:
LinkedList()
LinkedList(Collection c)
Các phương thức cơ bản: ngoài những phương thức mà nó kế thừa từ lớp cha thì nó còn có một vài phương thức riêng rất có ích.
addFirst(Object obj) Thêm phần tử vào vị trí đầu danh sách.
addLast(Object obj) Thêm phần tử vào vị trí cuối danh sách.
getFirst() Lấy phần tử đầu tiên trong danh sách.
getLast() Lấy phần tử cuối trong danh sách.
removeFirst() Xóa phần tử đầu tiên trong danh sách.
removeLast() Xóa phần tử cuối trong danh sách.
Ví dụ:
public static void main(String[] args){
LinkedList link=new LinkedList();
link.add(“a”);
link.add(“b”);
link.add(new Integer(10));
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
link.addFirst(new Integer(20));
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
link.addLast(“c”);
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
link.add(2,“j”);
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
link.add(1,“t”);
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
link.remove(3);
System.out.println(“The contents of array is” + link);
System.out.println(“The size of an linkedlist is” + link.size());
}
}