2016-06-22 16 views
7

Gần đây, trong một cuộc phỏng vấn tôi đã được hỏi, chính xác là một cái xô trong hashmap? Cho dù đó là một mảng hoặc một mảng danh sách hoặc những gì?Những gì chính xác là xô trong hashmap?

Tôi đã nhầm lẫn. Tôi biết hashmaps được hỗ trợ bởi mảng. Vì vậy, tôi có thể nói rằng xô là một mảng với công suất 16 trong đầu lưu trữ hashcodes và danh sách liên kết có con trỏ bắt đầu của họ?

Tôi biết cách thức một hashmap hoạt động nội bộ, chỉ muốn biết chính xác là một nhóm về cấu trúc dữ liệu.

+1

bạn cần phải đọc (http://stackoverflow.com/questions/6493605/how-does-a-java-hashmap-handle-different-objects-with -e-same-hash-code/6493946 # 6493946) – emotionlessbananas

+0

@JonnyHenly: Tôi đặc biệt muốn biết xô là gì? Trong câu hỏi được đề cập, nó là nhiều hơn làm việc trên hashcodes và thực hiện hashmap. Vì vậy, tôi không xem xét câu hỏi của tôi là một bản sao. Các câu hỏi có thể tương tự, nhưng câu trả lời mà họ đang tìm kiếm là khác nhau. – dgupta3091

Trả lời

14

Không, thùng là mỗi phần tử trong mảng mà bạn đang đề cập đến. Trong các phiên bản Java trước đó, mỗi nhóm chứa một danh sách liên kết các mục nhập Bản đồ. Trong các phiên bản Java mới, mỗi nhóm chứa một cấu trúc cây của các mục nhập hoặc một danh sách các mục nhập liên kết.

Từ các ghi chú thực hiện trong Java 8:

/* 
* Implementation notes. 
* 
* This map usually acts as a binned (bucketed) hash table, but 
* when bins get too large, they are transformed into bins of 
* TreeNodes, each structured similarly to those in 
* java.util.TreeMap. Most methods try to use normal bins, but 
* relay to TreeNode methods when applicable (simply by checking 
* instanceof a node). Bins of TreeNodes may be traversed and 
* used like any others, but additionally support faster lookup 
* when overpopulated. However, since the vast majority of bins in 
* normal use are not overpopulated, checking for existence of 
* tree bins may be delayed in the course of table methods. 
... 
+0

Vì vậy, khi chúng ta nói hashmap có công suất 16 ngay từ đầu, do đó, tại thời điểm đó nó tạo ra một mảng 16 không gian và có mỗi phần tử của nó được gọi là một nhóm. – dgupta3091

+0

@ dgupta3091 có, mặc dù trong Java 8 thực hiện mảng được tạo ra lazily (tức là chỉ khi mục đầu tiên được đặt trong HashMap). – Eran

+0

@ JonnyHenly Tôi vừa kiểm tra việc triển khai trong Java 8 và không có hàm khởi tạo nào trong mảng. Nó chỉ được khởi tạo bởi 'resize()' (được gọi là 'put' nếu mảng là null) và' readObject (java.io.ObjectInputStream s) '(deserialization). – Eran

13

bucket

Tôi hy vọng điều này có thể giúp bạn hiểu việc thực hiện bản đồ băm tốt.

0

Xô cơ bản là cấu trúc dữ liệu đang được sử dụng trong thuật toán Phân trang của Hệ điều hành. Để có một ngôn ngữ rất Laymans.

Đối tượng đại diện cho một hashcode đặc biệt đang được lưu trữ trong thùng đó. (Về cơ bản bạn có thể xem xét các tiêu đề của cấu trúc danh sách dữ liệu liên quan đến là giá trị hashcode đó được thể hiện trong các điều khoản của xô)

Các tài liệu tham khảo của đối tượng đang được lưu trữ trong danh sách liên kết, có tiêu đề đại diện cho giá trị của Hashcode.

JVM tạo chúng và kích thước, phụ thuộc vào bộ nhớ được JVM phân bổ.

0

chính xác là một mảng nút. Vì vậy, một thùng là một thể hiện của lớp java.util.HashMap.Node. Mỗi nút là một cấu trúc dữ liệu tương tự như LinkedList, hoặc có thể giống như một TreeMap (kể từ Java 8), HashMap tự quyết định cái gì tốt hơn cho hiệu suất - giữ các nhóm như LinkedList hoặc TreeMap. TreeMap sẽ chỉ được chọn trong trường hợp hàm hashCode() được thiết kế kém, khi nhiều mục nhập sẽ được đặt trong một thùng duy nhất. Xem cách xô trông giống như trong HashMap:

/** 
    * The table, initialized on first use, and resized as 
    * necessary. When allocated, length is always a power of two. 
    * (We also tolerate length zero in some operations to allow 
    * bootstrapping mechanics that are currently not needed.) 
    */ 
    transient Node<K,V>[] table; 
Các vấn đề liên quan