Danh sách

Kiểu dữ liệu và Exceptions trong Java

Jim White

Java Developer

Giao diện List

  • Giao diện List, là giao diện con của Collection
    • Xác định một nhóm đối tượng có thứ tự
    • Có thể chứa phần tử trùng lặp
  • Nhiều triển khai của List
    • Hành vi tương tự nhau
    • Triển khai quyết định cách quản lý đối tượng bên dưới
Kiểu dữ liệu và Exceptions trong Java

Các triển khai List

  • ArrayList - danh sách đối tượng có thể thay đổi kích thước, có chỉ mục (như mảng), có thứ tự

ArrayList giống mảng Java với phần tử có chỉ mục

  • LinkedList - các đối tượng nối với nhau bằng liên kết tới đối tượng trước/sau.

LinkedList là danh sách đối tượng nối bằng con trỏ

  • Bất kể triển khai nào, thêm, xóa, thay đổi đối tượng theo cùng cách
1 Xem https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html để biết các kiểu List và chi tiết
Kiểu dữ liệu và Exceptions trong Java

ArrayList

  • Tạo thể hiện với new và dùng generics để chỉ định kiểu phần tử
  • Thêm đối tượng vào cuối danh sách bằng .add(object)
  • Truy cập đối tượng bằng .get(index)
    • ArrayList dùng chỉ mục bắt đầu từ 0
  • Thay thế/thay đổi đối tượng bằng .set(index, object)
  • Xóa đối tượng bằng .remove(index)
  • Xóa/ làm trống toàn bộ bằng .clear()
  • Đếm số phần tử bằng .size()
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // Cho phép trùng lặp
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// Xóa con ngựa đầu tiên animals.remove(0); // Xóa tất cả đối tượng animals.clear();
animals.size();
Kiểu dữ liệu và Exceptions trong Java

Đối tượng và kiểu nguyên thủy

  • Dùng wrapper để thêm kiểu nguyên thủy vào bất kỳ đối tượng trong Collections Framework
  • Kiểu nguyên thủy được "autobox"
    • Autobox: tự động bọc kiểu nguyên thủy vào wrapper
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 được Integer tự động bọc rồi thêm vào
  • Autoboxing hoạt động với mọi đối tượng trong Collections Framework
Kiểu dữ liệu và Exceptions trong Java

Bộ sưu tập khác loại

  • Cấu trúc dữ liệu của Collections Framework có thể khác loại
    • Khác loại = chứa đối tượng nhiều kiểu
    • Dùng Object làm kiểu tham số hóa
ArrayList<Object> list = new ArrayList<Object>(); // Cho phép mọi đối tượng
list.add(new Integer(5)); // Thêm một Integer
list.add(6); // Thêm Integer qua autoboxing
list.add("Hello"); // Thêm một String
Kiểu dữ liệu và Exceptions trong Java

Lặp một List

  • Dùng cú pháp "for-each" để lặp qua các đối tượng của List
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // for-each để lặp qua toàn bộ phần tử trong ArrayList
    System.out.println(animal);
}
horse
cow
chicken
Kiểu dữ liệu và Exceptions trong Java

In List bằng println

  • Nội dung của một List (như ArrayList) có thể hiển thị bằng println
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // Hiển thị toàn bộ phần tử trong ArrayList

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // Hiển thị toàn bộ phần tử trong ArrayList
[horse, cow, chicken]
[5, Hello]
Kiểu dữ liệu và Exceptions trong Java

LinkedList

  • LinkedList được tạo giống ArrayList
  • LinkedList có cùng phương thức với ArrayList
import java.util.LinkedList;
...
LinkedList<String> cars // Tạo một ...
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // Thêm đối tượng vào danh sách
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // Thay thế một đối tượng
System.out.println(cars); // Hiển thị danh sách
cars.remove(0); // Xóa một đối tượng
cars.clear();  // Xóa tất cả đối tượng
cars.size(); // Lấy độ dài danh sách
[Ford, Toyota]
Kiểu dữ liệu và Exceptions trong Java

Phương thức LinkedList bổ sung

  • Một số phương thức bổ sung
    • addFirst() thêm vào đầu danh sách
    • addLast() thêm vào cuối danh sách
    • removeFirst() xóa ở đầu
    • removeLast() xóa ở cuối
cars.addFirst("Fiat"); // Thêm vào đầu
cars.addLast("BMW"); // Thêm vào cuối
cars.removeFirst(); // Xóa phần tử đầu
cars.removeLast(); // Xóa phần tử cuối
Kiểu dữ liệu và Exceptions trong Java

Tương đồng giữa các kiểu Collection

  • ArrayListLinkedList trông giống nhau
    • Các kiểu khác trong Collections Framework cũng có nét tương đồng
    • Chủ đích như vậy
  • Chúng chia sẻ giao diện: List
    • Ví dụ về đa hình ("nhiều dạng")
Kiểu dữ liệu và Exceptions trong Java

ArrayList vs LinkedList

  • Thao tác trên ArrayListLinkedList (hoặc bất kỳ List nào) là như nhau
    • Chọn kiểu List tùy trường hợp sử dụng
  • Lưu ý với ArrayList:
    • Truy cập ngẫu nhiên nhanh (ví dụ: list.get(11))
    • Chậm khi thêm/xóa giữa danh sách
    • Do phải di chuyển phần tử khi chèn/xóa

Thêm phần tử giữa ArrayList cần di chuyển nhiều phần tử

Kiểu dữ liệu và Exceptions trong Java

ArrayList vs LinkedList

  • Lưu ý với LinkedList:
    • Truy cập ngẫu nhiên chậm (ví dụ: list.get(11))
    • Thêm/xóa giữa danh sách nhanh
    • Vì không di chuyển phần tử, chỉ đổi vài tham chiếu

Thêm phần tử giữa LinkedList chỉ cần đổi một số con trỏ

Kiểu dữ liệu và Exceptions trong Java

Ayo berlatih!

Kiểu dữ liệu và Exceptions trong Java

Preparing Video For Download...