# Tất tần tật về HashMap trong java (Phần 1)

HashMap được coi là một trong những Java Collection phổ biến nhất, và cũng thường xuyên góp mặt trong list các câu hỏi phỏng vấn.
Vậy bạn đã bao giờ tự hỏi bên trong HashMap có gì và HashMap hoạt động như thế nào? Bài viết này sẽ giải đáp tất tần tật liên quan đến HashMap :D

1. Cấu trúc bên trong Hashmap

  • HashMap thuộc Java Collection, nằm trong package java.util.
  • Bản chất bên trong HashMap chứa một chuỗi các node, mỗi node có 4 phần:
    1. int hash
    2. K key
    3. V value
    4. Node next alt text

Nhìn vào đây bạn có thể thấy rằng bên trong HashMap có chứa reference của node tiếp theo, khá quen thuộc nhỉ :v. Đúng vậy, giống với LinkList.

2. Khởi tạo / sử dụng HashMap và những điều có thể bạn chưa biết :D

Trước hết, cần giới thiệu 2 thông số quan trọng:

  • Initial Capacity: là dung lượng của HashMap tại thời điểm khởi tạo (nghĩa là số phần tử mà HashMap có thể chứa khi nó được khởi tạo). Mặc định, con số này là 2^4=16. Có nghĩa là khi mình tạo HashMap bằng câu lệnh

            Map hashMap = new HashMap();
    

hashMap của mình có thể chứa 16 cặp key-value. Nhưng nếu mình muốn lưu 1000 phần tử thì sao? có được ko? Tất nhiên là có, nhưng khi nào thì mới được tăng, và tăng bao nhiêu mới được? Đưng lo lắng, những thông sổ tiếp theo sẽ giúp bạn trả lời :v.

  • Load factor: Là một thông số mà giúp HashMap biết được khi nào thì cần tăng size, default load factor là 0.75. Ví dụ, tại thời điểm ban đầu, hashMap của mình chứa tối đa 16 phần tử, loadFactor = 0.75, suy ra khi mình put phần tử thứ 16*0.75 = 12 ( con số này gọi là Threadsold) thì hashMap của mình sẽ tự động tăng size. Và với mỗi lần tăng, sẽ lần lượt thành lũy thừa của 2 theo thứ tự: 2^4, 2^5, 2^6, 2^7...(quá trình này gọi là rehashing).

Như vậy, giả sử hashMap của bạn sẽ chứa rất nhiều phần tử, thì bạn nên tính đến việc ước lượng giá trị ban đầu và đưa vào initial capacity, để tránh việc rehashing quá nhiều lần ảnh hưởng đến performance.

            Map hashMap = new HashMap(1000);

Nhưng cũng có vấn đề xảy ra, các hoạt động cơ bản của hashMap đều cần lặp lại qua hashMap, về cơ bản dung lượng và kích thước của hashMap có ảnh hưởng đến perfomance, vì vậy giả sử hashMap của bạn có thể chứa tới cả triệu phần tử thì cũng không nên truyền initial capacity = 1 triệu vào đâu nhé.

3. Tóm lược một số điểm chú ý về Hashmap

  • HashMap không đồng bộ (unsynchronized ), nghĩa là HashMap cho phép nhiều thread truy cập đồng thời.
  • Các key trong HashMap phải là duy nhất, HashMap có thể chứa 1 key có giá trị null, còn value thì cái nào null cũng được.
  • HashMap không đảm bảo thứ tự của các phần tử trong nó.

Vẫn còn nhiều điều về HashMap lắm, phần sau mình sẽ giải thích HashMap hoạt động như thế nào khi mình gọi put() hay delete(), tại sao HashMap lại không đảm bảo thứ tự...
Link phần 2:
https://kipalog.com/posts/Tat-tan-tat-ve-HashMap-trong-java-Phan-2

Xin cảm ơn các bạn đã đọc bài viết này, nếu có gì thắc mắc thì comment bên dưới nhé :D
Nguồn tham khảo:
https://www.geeksforgeeks.org/java-util-hashmap-in-java-with-examples/

BanhMii 30-04-2021

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Banh Mii

2 bài viết.
6 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
2 0
Ở phần trước, chúng ta đã tìm hiểu cấu trúc bên trong và cách khởi tạo HashMap, ở phần này mình tiếp tục đi sâu hơn về cách HashMap hoạt động nhé. ...
Banh Mii viết 4 ngày trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
6 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!