2008-12-13 21 views
9

Bản năng đầu tiên của tôi là nói rằng mỗi khóa là một đối tượng và có mã băm, là mã được sử dụng để xác định xem liệu một bản sao có đang được chèn hay không. Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì để trở lại đó lên cho chắc chắn. Ai đó có thể cung cấp liên kết nói rằng, hoặc cung cấp câu trả lời thực sự ở đây? Cảm ơn!Java sử dụng để xác định xem khóa có phải là bản sao trong Bản đồ không?

Trả lời

17

Giao diện Map chỉ định rằng nếu hai khóa là null chúng là các từ khóa trùng lặp, nếu không, nếu có phím k sao cho key.equals(k) thì có một bản sao. Xem chứa hoặc có được phương pháp ở đây:

http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsKey(java.lang.Object)

Tuy nhiên, nó tùy thuộc vào việc thực hiện Map thế nào để đi về việc thực hiện kiểm tra đó, và một HashMap sẽ sử dụng một mã băm để thu hẹp các phím tiềm năng nó sẽ kiểm tra với phương thức equals. Vì vậy, trong thực tế, đối với một bản đồ băm điển hình, để kiểm tra bản sao, bản đồ sẽ lấy mã băm (có thể là mod một số kích thước) và sử dụng equals để so sánh với bất kỳ khóa nào có mã băm mod cùng kích thước cho phần còn lại.

+0

Cảm ơn bạn đã giải thích nó tốt hơn nhiều so với tôi :) – kevindaub

0

Sử dụng phương thức equals() trên khóa. Phương thức hashCode() chỉ giúp lưu trữ các khóa một cách hiệu quả cho bản đồ.

3

Đọc câu hỏi sai, nhưng câu trả lời của người trên là đúng và liên kết của tôi cung cấp câu trả lời về cách xác định câu hỏi (phương thức bằng). Xem xét các phương thức chứa và nhận trong liên kết.

Cách chèn bản đồ: Không thể có khóa trùng lặp trong Bản đồ. Nó sẽ thay thế giá trị cũ bằng giá trị mới nếu bạn tìm thấy khóa trùng lặp. Đây là link cho Giao diện bản đồ. Ngoài ra, nếu bạn nhìn vào phương thức put (K key, V value), nó cũng giải thích cách một bản đồ hoạt động. Hy vọng rằng sẽ giúp.

1

Tôi giả sử bạn đang đề cập đến java.util.Map, là giao diện được cung cấp trong thư viện Java chuẩn. Phương pháp xác định nếu một khóa là trùng lặp được để lại cho việc thực hiện cụ thể. Ví dụ: java.util.HashMap sử dụng equalshashCode. Bạn có thể viết bản đồ thực hiện Bản đồ của riêng bạn sử dụng một cái gì đó hoàn toàn khác.

0

Cẩn thận với vỏ cạnh ở đây. Phím không phải lúc nào cũng trùng lặp. Trong thực tế, các phím null hóa ra là gây ra nhiều thất vọng giữa việc triển khai Bản đồ (xem bài viết của tôi trên Consistency).

Ví dụ: các phím null là OK trong HashMaps, nhưng không phải trong TreeMap sử dụng thứ tự tự nhiên, hoặc ConccurentHashMap trong đó các phím null bị cấm. Vấn đề ở đây là chúng ném các ngoại lệ chưa được khai thác trên nhiều phương thức của chúng nếu bạn sử dụng một khóa rỗng và giới thiệu các lỗi thời gian chạy đáng sợ khi bạn chuyển đổi các triển khai trong khi tái cấu trúc.

Các vấn đề liên quan