2010-09-08 29 views
12

Tôi có một lớp mà tôi muốn thiết lập làm khóa trong HashMap. Tôi đã triển khai phương thức compareTo cho lớp đó. Nhưng vẫn còn khi tôi làm:Đặt lớp của riêng làm khóa trong java Hashmap

 
map.put(new MyKey(dummyArguements) , dummyValue); 
System.out.println(map.get(new MyKey(dummyArguements))); 

Tôi nhận được giá trị rỗng. Vì vậy, điều đó có nghĩa là hashmap không thể xác định rằng hai phím (để nhận được & gọi điện) giống nhau.

Có thể ai đó giúp tôi ở đây không?

Trả lời

32

Bạn cần triển khai hashCode()equals(). Yêu cầu thêm compareTo() cho bản đồ/tập hợp đã được sắp xếp.

Xem this question để biết chi tiết.

+1

Tôi có nghĩa là không thiếu tôn trọng (tôi cũng không tin điều này là đúng), nhưng ** cách bạn biết điều này? Tôi đã đọc tài liệu ['HashMap'] (http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html) nhiều lần; các giao diện và kế thừa sau đây .... và không có gì từ xa ngụ ý các phương thức được đề cập ở trên cần được triển khai cũng như không ghi đè (vì chúng đã được thừa hưởng từ lớp gốc của đối tượng '') để nó hoạt động đúng với 'HashMap'. –

+0

Định nghĩa của một số phương pháp trên giao diện Bản đồ thiết lập một số quy tắc. Ví dụ: containsKey() cụ thể đề cập bằng equals().Tài liệu hashCode() trên Object xác định mối quan hệ giữa nó và equals(). Tuy nhiên, tôi đồng ý với quan điểm của bạn - tài liệu HashMap nên tham khảo phương thức hashCode() và tài liệu nó sử dụng/yêu cầu cho các khóa của HashMap. –

+0

Ngoài ra, lớp học của bạn phải là 'không thay đổi' – Sadegh

3

1) Nói chung đối với các bộ sưu tập, những gì bạn muốn ghi đè là phương thức equals (và phương thức hashcode()) cho lớp của bạn. compareTo()/Comparable và Comparator thường được sử dụng để phân loại và chỉ sử dụng phương thức equals() cho đối tượng tương đương trong một số trường hợp - ví dụ là các trình thực hiện của SortedSet như TreeSet.

2) Vui lòng tuân thủ các tiêu chuẩn đặt tên Java trong mã của bạn. Tên lớp học của bạn phải được viết hoa ... ví dụ: new MyKey(dummyArguments). Xem http://www.oracle.com/technetwork/java/codeconventions-135099.html#367 (và http://www.oracle.com/technetwork/java/codeconvtoc-136057.html) để biết thêm chi tiết.

+0

Đã đổi tên lớp. Cảm ơn bạn đã chỉ ra. :) –

0

Bạn đã xác định được hashCode() chưa? compareTo là cần thiết để phân loại.

0

HashMap không kiểm tra compareTo();

HashMap kiểm tra hashCode()equals().

12

Bạn nên triển khai equals()hashCode(). Lớp học của bạn cũng nên không thay đổi. Nếu nó có thể thay đổi được, mã băm của nó có thể thay đổi sau khi thêm nó vào bản đồ. Sau đó, bản đồ có thể gặp sự cố khi tìm kiếm.

+3

+1 cho số không thể sửa đổi – helios

+0

Anh ấy đang làm mới trước 'put' và' add'. Vì vậy, bất biến không quan trọng. Vẫn là một điểm tốt, +1. – fastcodejava

0

Khi sử dụng Bộ sưu tập dựa vào băm như Bản đồ và Đặt bạn phải triển khai equals()hashCode() để đảm bảo chức năng chính xác. Nếu bạn không có myKey mới sẽ luôn khác với khóa được lưu trữ trong bản đồ vì nó sử dụng các cài đặt mặc định là equals()hashCode().

0

Bạn nên triển khai equals() và hashCode(). Lớp học của bạn cũng nên không thay đổi. Nếu nó có thể thay đổi được, mã băm của nó có thể thay đổi sau khi thêm nó vào bản đồ. Sau đó, bản đồ có thể gặp sự cố khi tìm kiếm.

0

Vì java8 bạn cũng nên thực hiện Comparable (thêm compareTo) vì nếu số lượng xung đột băm vượt quá 11, HashMap lưu trữ các mục trong cây nhị phân. Nếu không, hiệu suất sẽ bị

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