1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Hashmap Và Linkedlist

87 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trang 1

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 2

TeamNướ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 3

NƯỚC CODE DỪA

Trang 4

1 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 6

2 Đặ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 7

2 Đặ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 8

3 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 9

3 Cách hoạt động của Hashmap

Trang 10

3 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 11

3 Cách hoạt động của Hashmap

Trang 12

4 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 13

4 Cấu trúc phân tầng của lớp Hashmap

Trang 14

5 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 15

5 Constructor của lớp Hashmap

Trang 16

5 Constructor của lớp Hashmap

Trang 17

5 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 18

5 Constructor của lớp Hashmap

Trang 19

Từ 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 20

Từ 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 21

CÁCH TẠO

HASHMAP TRONG JAVA

Trang 22

Import thư viện

import java.util.HashMap;

Trang 25

Ví dụ

Trang 26

1 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 27

Giá 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 28

1 Thêm một phần tử

Các thao tác với hash map

Trang 29

2 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 30

Giá 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 31

3 Truy xuất phần tử

Các thao tác với hash map

Trang 32

3 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 33

SetPhương thức keySet() trả về

một set bao gồm các khóa có trong hashmap.

Trang 34

4 Lấy tất cả các khóa

Các thao tác với hash map

Trang 36

Danh 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 37

5 Lấy tất cả các giá trị

Các thao tác với hash map

Trang 39

6 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 40

6 Lấy tất cả các cặp khóa - giá trị

Các thao tác với hash map

Trang 41

6 Lấy tất cả các cặp khóa - giá trị

Các thao tác với hash map

Output

Trang 42

7 Duyệt các phần tửSử dụng keySet()

Các thao tác với hash map

Trang 43

7 Duyệt các phần tửSử dụng keySet()

Các thao tác với hash map

Output

Trang 44

7 Duyệt các phần

Sử dụng entrySet()

Các thao tác với hash map

Trang 45

7 Duyệt các phần

Sử dụng entrySet()

Các thao tác với hash map

Trang 46

8 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 47

8 Kiểm tra sự tồn tại của khóa

Các thao tác với hash map

Trang 48

Giá 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 49

09 Xóa phần tử

Các thao tác với hash map

Trang 50

01 Đặ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 56

2 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 57

2 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 58

2 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 59

3 Đặ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 61

3 Đặ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 62

4 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 63

4 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 64

4 Khai Báo và Khởi tạo

Ví dụ

LinkedList<Type> list = new LinkedList<Type>();

Trang 65

01 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 66

01 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 69

02 Truy cập, sửa giá trị phần tử

• Object set(int index, Object element)

Trang 72

03 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 75

04 Lấy giá trị index

• int indexOf(Object element)

• int lastIndexOf(Object element)

Trang 79

06 Chuyển linked list thành mảng (array)

Trang 81

Khá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 82

Khá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 83

Khá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 84

Khá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 85

07 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 86

THANK 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 87

THANKS FOR WATCHING

Ngày đăng: 16/06/2024, 21:27

w