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

Thông tin cơ bản

Tiêu đề HashMap và Linkedlist trong Java
Tác giả Nước Code Dừa, Phan Thành Công, Trần Vũ Bão, Phan Thị Thuỷ Hiền, Nguyễn Đỗ Đức Minh
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Programming with Java
Thể loại Seminar
Năm xuất bản 2024
Định dạng
Số trang 87
Dung lượng 16,49 MB

Nội dung

■ 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 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

Team 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 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 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 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

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

• 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 23

trị HashMap<KeyType, ValueType>()

Trang 25

Ví dụ

Trang 27

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

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 34

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

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

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();

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 46

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

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

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

Trang 58

2 Giới thiệu về LinkedList trong Java

• LinkedList hoạt động như

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 60

3 Đặ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 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 java.util.LinkedList;

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

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ử

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

Trang 75

04 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 77

05 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 79

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

Trang 81

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

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

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

THANKS FOR

WATCHING

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

w