TRƯỜ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 2TeamNước Code Dừa
22520170Phan Thành Công22520124Trần Vũ Bão
22520423 Phan Thị Thuỷ Hiền
Tools/LanguagesEclipse, 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 Hashmap5 Constructor của lớp
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
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 bộ sưu tập này.
• Bucket: nếu hai khóa có cùng giá trị băm, chúng sẽ được lưu trữ trong cùng một vị trí, được gọi là bucket Trong mỗi bucket, các cặp khóa-
giá trị được lưu trữ dưới dạng các phần tử trong một danh sách liên kết đơn.
MỘT SỐ KHÁI NIỆM
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
• 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 nhau
• V getOrDefault(Object key, v defaultValue): trả về value được liên kết với key được chỉ định Nếu key không tồn tại, trả về giá trị mặc định
• void forEach(BiCosumer<? super K, ? super V> action): thực hiện một hành động trên mỗi cặp key-value trong HashMap
• 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 25Ví dụ
Trang 261 Thêm một phần tử
2 Cập nhật giá trị3 Truy suất giá trị
8 Kiểm tra sự tồn tại của khóa
4 Lấy tất cả các khóa
Trang 27Giá trị cũ(nếu có) / nullPhươ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 30Giá trị (nếu có) / null
Phươ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 33SetPhương thức keySet() trả về
một set bao gồm các khóa có trong hashmap.
Trang 344 Lấy tất cả các khóa
Các thao tác với hash map
Trang 36Danh sách (dạng
Collection)Phương thức values() trả về
một Collection bao gồm tất các giá trị của hashmap
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();map.entrySet();
Tham số
OutputMô tả
SetPhương thức entrySet() trả về
một Set bao gồm tất cả các cặp khóa & giá trị của
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 447 Duyệt các phần
Sử dụng entrySet()
Các thao tác với hash map
Trang 457 Duyệt các phần
Sử dụng entrySet()
Các thao tác với hash map
Trang 468 Kiểm tra sự tồn tại của khóa
HashMap<String, Integer> map = new HashMap();map.containsKey(_key_);
Tham số
ReturnMô tả
True/false (boolean)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 48Giá trị của phần tử vừa xóa (nếu có) / null
Phương thức remove(key) sẽ xó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 Java
05 Constructor của LinkedList
07 So sánh 2 lớp
ArrayList và LinkedList
06 Các phương thức của LinkedList
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 tiên
⚬ Next: Lưu trữ địa chỉ của phần tử tiếp theo Null cho phần tử cuối cùng.
⚬ Data: Lưu trữ dữ liệu
Trang 582 Giới thiệu về LinkedList trong Java
• LinkedList hoạt động như một mảng động kích thước của list sẽ tự động tăng/giảm khi chúng ta thực hiện thêm/xóa phần tử.
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 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
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 6501 Thêm phần tử
02 Truy cập, sửa Cập nhật giá trị
04 Lấy giá trị index
05 Trả về số lượng phần tử, Tim kiếm phần tử
03 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ử
• 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
• Object remove()
• boolean remove(Object element)
• Object remove(int index)• Object removeLast()
• boolean removeLastOccurrence (Object element)
Trang 7504 Lấy giá trị index
• int indexOf(Object element)
• int lastIndexOf(Object element)
Trang 7906 Chuyển linked list thành mảng (array)
Trang 81Khác nhau
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ử
Trang 82Khác nhau
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
Độ phức tạp: O(1)Thao tác
thêm, xoá
Sử dụng bộ nhớ
Yêu cầu ít bộ nhớ hơn, vì chỉ lưu trữ data và index
Yêu cầu nhiều bộ nhớ hơn, vì LinkedList lưu trữ data và tham chiếu tới phần tử trước và sau nó
Trang 83Khác nhau
Nhanh hơn vì các phần tử trong ArrayList được lưu dựa trên index
Có thể truy xuất ngẫu nhiên
Độ Phức tạp: O(1)
Chậm hơn vì phải duyệt qua lần lượt các phần tử từ đầu tiên cho đến cuối cùng
Không thể truy xuất ngẫu nhiên
Độ Phức tạp: O(1)Thao tác
truy xuất
Khi nào sử dụng
Tốt hơn trong việc lưu trữ và truy xuất dữ liệu
Tốt hơn trong việc thao tác dữ liệu (thêm / xóa)
Trang 84Khác nhau
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 86THANK YOU!Q&A
Nguồn tụi mình tham khảo đã có mặt trên Slide:
• LinkedList
• https://www.geeksforgeeks.org/linked-list-in-java/
• linkedlist
https://viettuts.vn/java-collection/su-khac-nhau-giua-arraylist-va-• https://stringee.com/vi/blog/post/Linkedlist-trong-java• https://gpcoder.com/2561-so-sanh-arraylist-va-linkedlist/• HashMap
• https://rikkei.edu.vn/hashmap-trong-java/
• https://stringee.com/vi/blog/post/hashmap-trong-java• https://www.w3schools.com/java/java_hashmap.asp
Trang 87THANKS FOR WATCHING