01/10/2018, 01:16

[Link]Map/HashMap hoạt động như thế nào?

Đây là một câu hỏi thường gặp trong những buổi phỏng vấn ứng viên Java, và cũng có không ít bạn vì câu hỏi này mà gặp trắc trở, hôm nay chúng ta sẽ thảo luận về nó.

Chúng ta sẽ lần lượt đi qua các điểm.

  • HashMap là gì?
  • Hashing là gì?
  • HashMap được implement thế nào trong Java
  • Performance của HashMap so sánh với các data structure khác
  • Tổng kết

Cùng xem bài viết nhé!

Codeaholicguy – 13 Dec 15

Series Java những điều có thể bạn đã biết: Map/HashMap hoạt động như thế nào?

Đây là một câu hỏi thường gặp trong những buổi phỏng vấn ứng viên Java, và cũng có không ít bạn vì câu hỏi này mà gặp trắc trở, hôm nay chúng ta sẽ thảo luận về nó.…

viết 03:25 ngày 01/10/2018

thớt ế quá thôi góp gạch xây nhà vậy

viết sơ sài quá:

  • “nhưng mỗi key thì có thể được ánh xạ đến nhiều hơn một giá trị”: câu cú lủng củng, đúng ra phải là 1 value có thể có nhiều key ánh xạ tới. 1 key ánh xạ tới 1 value chứ làm gì 1 key ánh xạ tới 10 value??

  • “độ phức tạp chỉ còn là O(1). Đó chính là Hash Function.” O(1) mà hash function ở đâu lòi ra đây? Ko ăn nhập gì với phần mảng chưa/đã sắp xếp ở trên…

  • tại sao bucket lại sử dụng linked list để lưu trữ? ArrayList được ko?

  • “Lưu ý nho nhỏ, độ phức tạp của hàm get() và put() trong HashMap là O(1) vì nó sử dụng hashCode để tìm giá trị”: put() lúc nào cũng có có đpt là O(1) thiệt à? Hay còn thiếu từ gì đó?

  • “Và bây giờ tôi chắc chắn rằng các bạn đang thắc mắc, hash thì cũng chỉ là một con số, khả năng trùng nhau là có”:có 1 nguyên tắc cực kì nổi tiếng và cực kì đơn giản để khẳng định trùng bucket / trùng hash code là có, sao ko nêu ra…

  • “Tất cả các class đều có thể là key nếu nó được override hàm equals() và
    hashCode(), ngoài ra việc này cũng giúp biến các class trở thành
    immutable class”: thiệt vậy sao? Chỉ cần override equals() và hashCode() là class trở thành immutable à?

  • “Hàm get(Object key) cũng kiểm tra xem key có null hay
    không. Null cũng được coi là một key trong HashMap, và dĩ nhiên chỉ có
    một key null. Nếu key là null thì hash luôn luôn là 0 và tương ứng index
    cũng là 0. Nếu key không phải là null thì gọi hash function tương ứng
    với key.”
    return (e = getNode(hash(key), key)) == null ? null : e.value;
    dòng này có phải là kiểm tra Object key == null đâu? get(key) trả về null khi key ko có trong map (e == null). Còn cái e.value có null hay ko thì bố ai biết…

  • phần performance thì ko có cũng được, viết thêm chả để làm gì @_@ Nếu viết thì phải nêu tầm quan trọng của hash function ảnh hưởng tới performance thế nào (vd trùng hash code), rồi nêu cái load factor vô, hoặc nêu ưu/nhược của hash map so với tree map / avl binary tree, v.v…

bài viết tên là “hoạt động như thế nào?” mà chả thấy đá động gì tới put() nó tăng bucket lên thế nào, chỉ đơn giản là x2 số lượng bucket thôi à? Tại sao x2 mà ko phải x3 x1.5… Hoặc còn có chiến thuật gì khác ko? v.v…

Hoang Nguyen viết 03:17 ngày 01/10/2018

Bạn xem thêm Java doc nhé, https://docs.oracle.com/javase/7/docs/api/java/util/Map.html

Quân viết 03:24 ngày 01/10/2018

Vấn đề bạn đó chỉ ra các thắc mắc không phải vì bạn đó không biết mà là bài viết bạn sơ sài quá, nếu cho newbie đọc thì có lẽ có chút ý nghĩa nhưng để hiểu sâu thì bài viết không đáp ứng được. Bạn sửa thêm nhé, không cần quăng link của oracle đâu

Bài liên quan
0