■ Nếu có phần tử với key tương ứng được tìm thấy trong danh sách liên kết đơn của bucket, value tương ứng với key đó sẽ được trả về.. Các phương thức của lớp Hashmap • void clear: xoá tấ
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
SEMINAR LẬP TRÌNH JAVA
HASHMAP VÀ LINKEDLIST TRONG JAVA
Presented Day
Nước Code Dừa 07/03/2024
Presented by
Trang 2Team Nước Code Dừa
Short Description
LinkedList and HashMap are popular data structures in languages such as C/C++, Java, In this article, let's learn about the above data structures
Technologies/Models/
Tools/Languages Eclipse, IntelliJ, Java IDE online,
GENERAL INTRODUCTION
Trang 3NƯỚC CODE DỪA
Trang 41 Hashmap trong java là gì? 2 Đặc điểm của Hashmap
3 Cách hoạt động của Hashmap 4 Cấu trúc phân tầng của lớp Hashmap
5 Constructor của lớp
Hashmap
8 Hiên thực các phương thức phổ biến của Hashmap
6 Các phương thức của lớp Hashmap
HashMap
7 Cách tạo Hashmap trong java
Trang 5• Hashmap trong java là gì?
• HashMap là một lớp trong Java Collection
Framework
• HashMap hoạt động dựa trên cơ chế bảng băm
(hashing) để lưu trữ và truy xuất các phần tử dưới hình thức các cặp khóa-giá trị (key-value) không theo thứ tự nhất định
• Trong HashMap, các khóa phải là duy nhất vì khóa được sử dụng để lấy giá trị tương ứng từ map.
Trang 62 Đặc điểm của Hashmap
• Sử dụng hàm băm (hash function): HashMap sử dụng một
hàm băm để gán khóa (key) với một chỉ số trong một mảng (array) Điều này cho phép tìm kiếm các giá trị nhanh chóng dựa trên key.
• Mỗi phần tử trong HashMap được lưu trữ dưới dạng một cặp key-value Các key được sử dụng để truy xuất value tương
ứng.
• Cho phép value trùng lặp: HashMap cho phép value trùng
lặp, nhưng không cho phép key trùng lặp Trường hợp xuất
hiện key trùng lặp, value trước đó của key sẽ bị ghi đè.
• Cho phép null: HashMap cho phép sử dụng key null và value null
Trang 72 Đặc điểm của Hashmap
• Không thứ tự: Các phần tử trong HashMap không được sắp
xếp theo bất kỳ thứ tự nào, thứ tự này có thể thay đổi khi
thêm hoặc xóa.
• Không đồng bộ: HashMap không đồng bộ, không an toàn cho môi trường đa luồng Nếu cần sử dụng HashMap trong môi
trường đa luồng, có thể sử dụng ConcurrentHashMap.
• Tự động điều chỉnh kích thước: Khi số lượng phần tử trong
HashMap vượt quá ngưỡng tải trọng (load factor) của nó,
HashMap sẽ tự động điều chỉnh kích thước.
Trang 83 Cách hoạt động của Hashmap
HashMap hoạt động trên thuật toán băm (hashing) và sử dụng phương
thức hashCode() và equals() trên khóa (key) cho các thao tác get và put
• Phương thức hashcode(): tính toán giá trị băm của một khóa (key).
• Phương thức equals(): so sánh hai khóa (key) với nhau để xác định
chúng có bằng nhau hay không.
• Giá trị băm (hash value): xác định vị trí lưu trữ các phần tử trong các
Trang 93 Cách hoạt động của Hashmap
Trang 103 Cách hoạt động của Hashmap
• Khi muốn truy xuất một giá trị (value) từ HashMap bằng khoá (key)
tương ứng:
⚬ hashCode(): tính toán giá trị băm của khóa và xác định vị trí của
bucket cần tìm
⚬ equals(): so sánh khóa cần tìm với các khóa bucket
■ Nếu có phần tử với key tương ứng được tìm thấy trong danh sách
liên kết đơn của bucket, value tương ứng với key đó sẽ được trả về
■ Nếu không có, HashMap sẽ trả về giá trị null
• Khi thêm một cặp key-value mới vào HashMap:
⚬ equals(): kiểm tra tính duy nhất của khóa trong một bucket
■ Nếu equals() trả về false (không trùng lặp), cặp key-value mới sẽ
được thêm vào danh sách liên kết đơn trong bucket tương ứng
■ Nếu equals() trả về true (key bị trùng lặp), value mới sẽ ghi đè lên
value cũ
• Để đảm bảo rằng các phần tử được lưu trữ và truy xuất một cách hiệu
quả, người lập trình viên nên cài đặt phương thức hashCode và equals
cho lớp khóa
Trang 113 Cách hoạt động của Hashmap
Trang 124 Cấu trúc phân tầng của lớp Hashmap
• Lớp HashMap trong Java được xây dựng trên cơ sở
AbstractMap là một lớp trừu tượng cung cấp một số
phương thức cơ bản cho các lớp Map
• HashMap là một lớp con của AbstractMap và triển
khai của giao diện Map.
Trang 134 Cấu trúc phân tầng của lớp Hashmap
Trang 145 Constructor của lớp Hashmap
• HashMap(): tạo một Hashmap trống với kích thước mặc định
là 16 và tỷ lệ tải mặc định là 0.75.
• HashMap(int initialCapacity): tạo một HashMap trống với kích
thước ban đầu được chỉ định và tỷ lệ tải mặc định là 0.75.
• HashMap(int initialCapacity, float loadFactor): tạo một
HashMap trống với kích thước ban đầu và tỷ lệ tải được chỉ
định.
⚬ initialCapacity: kích thước ban đầu của HashMap (số lượng phần tử mà
nó có thể chứa trước khi phải tăng kích thước)
⚬ loadFactor: tỷ lệ tải của HashMap (khi số lượng phần tử trong HashMap
vượt qua kích thước * tỷ lệ tải, HashMap sẽ tăng kích thước)
Trang 155 Constructor của lớp Hashmap
Trang 165 Constructor của lớp Hashmap
Trang 175 Constructor của lớp Hashmap
• HashMap(Map<?extends K, ? extends V> m): tạo một
HashMap mới chứa các ánh xạ từ các khoá và giá trị được chỉ định.
⚬ "Map<? extends K, ? extends V> m" là một tham chiếu đến
một đối tượng Map, với K và V là hai kiểu dữ liệu bất kỳ.
⚬ "<? extends K, ? extends V>" chỉ định rằng đối tượng Map
này có thể chứa các cặp key-value với kiểu dữ liệu không nhất thiết phải trùng với kiểu dữ liệu của HashMap đang tạo.
Trang 185 Constructor của lớp Hashmap
Trang 19Từ Java 5, cú pháp của HashMap là HashMap<K,V>, trong
đó K đại diện cho Key(Khóa), V đại diện cho Value(Giá trị)
6 Các phương thức của lớp Hashmap
• void clear(): xoá tất cả các ánh xạ khỏi HashMap
• boolean containsKey(Object key): kiểm tra xem HashMap có chứa khoá được chỉ định hay không
• boolean containsValue(Object value): kiểm tra xem HashMap có chứa giá trị được chỉ định hay không
• Set<Map.Entry<K,V>> entrySet(): trả về một Set chứa tất cả các cặp key-value trong HashMap
• V get(Object key): trả về giá trị được liên kết với khoá được chỉ định
• boolean isEmpty(): kiểm tra xem HashMap có rỗng không
• Set<K> keySet(): trả về một Set chứa tất cả key trong HashMap
• V put(K key, V value): thêm một cặp key-value mới vào HashMap
• void putAll(Map<? extends K, ? extends V> m): đặt tất cả các cặp key-value từ Map khác vào HashMap
• V remove(Object key): xoá cặp key-value được chỉ định khỏi HashMap
• int size(): trả về số lượng cặp key-value có trong HashMap
• Collection<V> values(): trả về một Collection chứa tất cả các giá trị trong HashMap
Trang 20Từ phiên bản Java 8, HashMap trong Java được bổ sung
thêm nhiều phương thức mới phục vụ các thao các khác
• V putIfAbsent(K key, V value): đặt một cặp key-value mới vào HashMap nếu key chưa tồn tại
• boolean remove(Object key, Object value): xoá một cặp key-value khỏi HashMap nếu key và
value được chỉ định khớp với một cặp có sẵn
• boolean replace(K key, V oldValue, V newValue): thay thế value cũ bằng value mới nếu key và value cũ đã được chỉ định khớp với một cặp có sẵn
• V replace(K key, V value): thay thế value hiện tại của key được chỉ định bằng value mới Trả về value cũ hoặc null nếu không có giá trị nào được liên kết với key đó
6 Các phương thức của lớp Hashmap
Trang 21CÁCH TẠO
HASHMAP TRONG JAVA
Trang 22Import thư viện
import java.util.HashMap;
Trang 23trị HashMap<KeyType, ValueType>()
Trang 25Ví dụ
Trang 27Giá trị cũ(nếu có) / null
Phương thức put(key, value) thêm
một cặp key - value vào hashmap
và trả về null Nếu key đã tồn tại,
cập nhật giá trị mới cho key và trả
về giá trị cũ tương ứng với key.
Trang 281 Thêm một phần tử
Các thao tác với hash map
Trang 292 Cập nhật giá trị
Các thao tác với hash map
Thêm/cập nhật giá trị đều dùng hàm put() Nếu phần tử chưa tồn tại thì thêm, ngược lại cập nhật
Trang 30Phương thức get(key) trả về
giá trị tương ứng với key trong
hashmap Nếu key không tồn
tại thì trả về null
Trang 313 Truy xuất phần tử
Các thao tác với hash map
Trang 323 Truy xuất phần tử Trường hợp phần tử không tồn tại
Các thao tác với hash map
Trang 344 Lấy tất cả các khóa
Các thao tác với hash map
Trang 375 Lấy tất cả các giá trị
Các thao tác với hash map
Trang 396 Lấy tất cả các cặp khóa và giá trị
HashMap<String, Integer> map = new HashMap();
Trang 406 Lấy tất cả các cặp khóa - giá trị
Các thao tác với hash map
Trang 416 Lấy tất cả các cặp khóa - giá trị
Các thao tác với hash map
Output
Trang 427 Duyệt các phần tử Sử dụng keySet()
Các thao tác với hash map
Trang 437 Duyệt các phần tử Sử dụng keySet()
Các thao tác với hash map
Output
Trang 468 Kiểm tra sự tồn tại của khóa
HashMap<String, Integer> map = new HashMap();
Phương thức containsKey(key)
sẽ trả về true nếu HashMap
chứa khóa đã cho và false nếu
không.
Trang 478 Kiểm tra sự tồn tại của khóa
Các thao tác với hash map
Trang 48xóa phần tử có khóa key ra
khỏi hashmap và trả về giá trị
của phần tử vừa xóa nếu có,
ngược lại trả về null.
Trang 4909 Xóa phần tử
Các thao tác với hash map
Trang 5001 Đặt ra vấn đề 02 Giới thiệu về LinkedList trong
08 Ví dụ về việc sử dụng LinkedList
LinkedList
Trang 51• Đặt ra vấn đề
Đặt ra vấn đề: sử dụng array hay lớp ArrayList
để giải quyết bài toán thêm/xóa 1 phần tử vào
vị trí chính giữa tốn nhiều chi phí
Trang 52• Đặt ra vấn đề
Trang 53• Đặt ra vấn đề
Giải quyết vấn đề: sử dụng cấu trúc dữ liệu danh sách liên kết (linked list)
Trang 54• Đặt ra vấn đề
Giải quyết vấn đề: đối với bài toán xóa 1 phần tử ở vị trí chính giữa, khi
sử dụng linked list, chúng ta chỉ cần cập nhật lại vị trí tham chiếu của các liên kết
Trang 55• Đặt ra vấn đề
• Khi học C++, chúng ta sử dụng thư viện STL để thuận tiện trong việc
thao tác với linked list.
• Tương tự với ngôn ngữ Java, chúng
ta sẽ sử dụng lớp LinkedList được
cung cấp bởi Java Collections
Framework
Trang 562 Giới thiệu về LinkedList trong Java
• Là một lớp trong Java Collection
Framework
• Sử dụng danh sách liên kết đôi
(Doubly Linked List) để lưu trữ
các phần tử.
Trang 572 Giới thiệu về LinkedList trong Java
• Mỗi phần tử trong danh sách liên kết được gọi là nút (node), gồm 3 trường:
⚬ Prev: Lưu trữ địa chỉ của phần tử trước đó Null cho phần tử đầu
Trang 582 Giới thiệu về LinkedList trong Java
• LinkedList hoạt động như
Trang 593 Đặc điểm cần nhớ về LinkedList
• Có thể chứa các phần tử trùng lặp
• Duy trì thứ tự của phần tử được thêm vào
• Thao tác thêm/xóa nhanh, vì không cần phải dịch chuyển nếu có bất kỳ phần tử nào được thêm/xóa khỏi danh sách.
Trang 603 Đặc điểm cần nhớ về LinkedList
• Các phần tử trong LinkedList có thể nằm cách ly nhau (không liên
tục) trong bộ nhớ Bởi nó là một liên kết có tính hai chiều giữa các
phần tử Mỗi phần tử trong danh sách cầm giữ 2 tham chiếu: 1 tham chiếu đến phần tử đứng trước nó và 1 đến phần tử ngay sau nó.
Trang 613 Đặc điểm của lớp LinkedList
• Có thể được sử dụng như một
List(danh sách), Stack(ngăn xếp) hay
Queue(hàng đợi).
Trang 624 Khai Báo và Khởi tạo
• LinkedList là một lớp thuộc package java.util
• Khi muốn sử dụng lớp LinkedList, phải import java.util.LinkedList;
Khai Báo
Trang 634 Khai Báo và Khởi tạo
• Có 2 cách :
⚬ non-generic: LinkedList list = new LinkedList();
⚬ generic: LinkedList<Type> list = new LinkedList<Type>();
Khởi tạo
Trang 644 Khai Báo và Khởi tạo
Ví dụ
LinkedList<Type> list = new
LinkedList<Type>();
Trang 6503 Xóa phần tử 06 Chuyển thành
mảng(Array)
5 Các phương thức của LinkedList
Trang 6601 Thêm phần tử
• Chèn element vào vị trí index Ném một IndexOutOfBoundsException nếu index đã cho ở bên ngoài dãy (index < 0 || index > size())
• Nối phần tử vào cuối danh sách
• chèn phần tử vào đầu danh sách
• chèn phần tử vào cuối danh sách
• thêm tất cả các phần tử của Collection vào cuối danh sách
• void add(int index, Object
element)
• boolean add(Object element)
• void addFirst(Object element)
• void addLast(Object element)
• boolean addAll(Collection c)
Trang 6902 Truy cập, sửa giá trị phần tử
Phương thức Mô tả
• Trả về phần tử ở vị trí index
• Trả về phần tử đầu tiên trong danh sách
• Trả về phần tử cuối cùng trong danh sách
• Thay đổi giá trị phần tử tại vị trí index
• Object get(int index)
• Object getFirst()
• Object getLast()
• Object set(int index, Object
element)
Trang 7203 Xóa phần tử
• Xóa phần tử đầu tiên trong danh sách
• Xóa phần tử được chỉ định đầu tiên trong danh sách
• Xóa phần tử tại vị trí index được chỉ định
• Xóa phần tử cuối cùng trong danh sách
• Xóa phần tử xuất hiện cuối cùng được chỉ định trong danh sách
Trang 7504 Lấy giá trị index
• Trả về vị trí index của phần tử được chỉ định (phần tử xuất hiện đầu tiên) Nếu danh sách không chứa phần tử đó trả về -1
• Trả về vị trí index của phần tử được chỉ định (phần tử xuất hiện cuối cùng) Nếu danh sách không chứa phần tử đó trả về -1
• int indexOf(Object
element)
• int lastIndexOf(Object
element)
Trang 7705 Trả về số lượng phần tử, tìm kiếm phần tử
• Trả về số lượng phần tử của danh sách
• Trả về true nếu danh sách chứa phần tử được chỉ định, ngược lại trả về false.
• int size()
• boolean contains(Object
element)
Trang 7906 Chuyển linked list thành mảng (array)
Trang 81Khác nhau
ArrayList LinkedList
Sử dụng mảng động để lưu trữ các phần tử
Mỗi phần tử có 1 vị trí index
Sử dụng danh sách liên kết để lưu trữ các phần tử
Mỗi phần tử được gọi là node, lưu trữ 3 thông tin:
• tham chiếu phần tử trước nó
• giá trị của phần tử
• tham chiếu tới phần
tử kế tiếp Cấu trúc
dữ liệu
Trang 82Khác nhau
ArrayList LinkedList
Chậm hơn, vì sau khi thao tác thêm hoặc xóa cần sắp xếp lại vị trí các phần tử
Độ phức tạp: O(n)
Nhanh hơn, vì không cần sắp xếp lại vị trí các phần tử sau khi thêm hoặc xóa
Trang 84Khác nhau
ArrayList LinkedList
Chỉ hoạt động như 1 list
vì nó chỉ triển khai giao tiếp List
Có thể hoạt động như 1 ArrayList, stack, queue, Singly Linked List và Doubly Linked List vì nó triển khai các giao tiếp List và Deque
Trường hợp
sử dụng
Trang 8507 Ví dụ về việc sử dụng LinkedList trong đồ án
• Chương trình thêm id và tên sinh viên và chương trình sẽ tạo email
cho sinh viên và sẽ lưu trữ tất cả dữ liệu này trong Danh sách liên kết
để ta quản lý
• Chúng ta sử dụng Danh sách liên kết để lưu trữ thông tin các mặt
hàng mà người dùng đã mua
Trang 87THANKS FOR
WATCHING