2013-03-03 32 views
5

Có triển khai thực hiện lớp HashMap (hoặc giao diện Bản đồ) cho phép tôi sử dụng các hoạt động băm và thay thế tương đương ... Tương tự như cách bộ sưu tập cùng loại có thể được sắp xếp theo nhiều cách sử dụng Comparator trong Collections.sort (danh sách, bộ so sánh).Tùy chỉnh hashcode/bằng hoạt động cho HashMap

Tôi muốn tránh nếu có thể, tạo trình bao bọc khóa cung cấp các hoạt động hashcode và bằng mong muốn.


Trong trường hợp của tôi, một trong những kịch bản do tại sao tôi cần một cái gì đó như thế này:

Trong ứng dụng web của tôi, đối với mỗi yêu cầu, tôi nạp Location/ISP và các dữ liệu khác. Trong các phần khác nhau của mã (trong các lớp dịch vụ và kho lưu trữ của tôi), tôi có bộ nhớ cache "thu nhỏ" cụ thể theo yêu cầu của nó.

Đây là một mã số ví dụ đơn giản:

class GeoIpData{ 
    private String countryName; 
    private String state; 
    private String city; 
    private String isp; 
    @Override 
    public int hashCode() { 
     //countryName hashCode 
     //state hashCode 
     //city hashCode 
     //isp hashCode 
    } 
    @Override 
    public boolean equals(Object obj) { 
     // compare countryName 
     // compare state 
     // compare city 
     // compare isp 
    } 
} 

Map<GeoIpData,#Type1> fullCache = ... //This cache needs to be unique per countryName,state,city and isp 
Map<GeoIpData,#Type2> countryCache = ... //This cache needs to be unique per countryName 
Map<GeoIpData,#Type2> ispCache = ... //This cache needs to be unique per countryName,isp 

Để đạt được điều này 3 bản đồ trên cần 3 hashcode khác nhau và bằng phương pháp này.

fullCache: 
hashCode -> GeoIpData.hashCode(); 
equals -> GeoIpData.equals(Object obj); 

countryCache: 
hashCode -> {countryName hashCode } 
equals -> {compare countryName } 

ispCache: 
hashCode -> {countryName hashCode & isp hashCode } 
equals -> {compare countryName & compare isp hashCode } 

Trả lời

7

GNU Trove phép bạn cung cấp TObjectHashingStrategy cụ thể với băm của riêng bạn và tương đương với chức năng cho TCustomHashMap.

+0

Xin chào "Noofz" Cảm ơn bạn đã tư vấn, hãy để tôi làm một số tiêu chuẩn trước ... Bạn đã sử dụng điều này trước đây, nếu bạn có, nó hoạt động như thế nào trong môi trường nhiều luồng? Hoạt động cache.get (...) được thực hiện từ 5.000 đến 30.000 lần mỗi giây và có thể tăng gấp đôi. – NeilA

+0

Không, thật may là tôi không có kinh nghiệm sử dụng nó dưới một niềm vui lớn như vậy. – Mikhail

+0

Chạy một vài thử nghiệm. Trove dường như chậm hơn một chút ... – NeilA

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