2012-02-12 23 views
5

Có cách nào để thực sự thấy mã nguồn của các lớp java chuẩn không? Tôi đang tạo một bảng băm các điểm (HashSet<Point>) và tôi muốn chắc chắn rằng nó sẽ băm tốt, nhưng tôi không thể thấy phương thức hashCode() của Point thực sự trông như thế nào, vì vậy tôi không biết nó thực sự tốt đến mức nào Là. Ai giúp tôi với? Tôi có nên ghi đè nó không? Và nếu có, có cách nào dễ dàng để làm điều này mà không cần tạo một tệp/lớp java hoàn toàn mới không?Java - Phương thức hashCode() của lớp Point có tốt hay không, hay tôi nên ghi đè lên nó và viết của riêng tôi?

+0

Tôi không biết về các IDE khác, nhưng trong Eclipse bạn có thể đính kèm mã nguồn vào thư viện của Java. Window -> Preferences -> Java -> JRE được cài đặt -> Chọn các JAR -> Đính kèm nguồn. Điều hướng đến src.zip bạn nhận được với JDK của bạn (hoặc theo liên kết của Jon Skeet) và voilà. – Jeffrey

+0

Nguồn nằm trong 'src.zip' trong thư mục JDK của bạn. –

+0

Bạn cũng có thể google> nguồn điểm awt java và kết quả tìm kiếm đầu tiên rất có thể là mã nguồn hoàn chỉnh cho lớp :-) – Yuval

Trả lời

8

Nếu bạn đang tìm kiếm hashCode() của java.awt.Point, số này được xác định trong java.awt.geom.Point2D.

/** 
* Returns the hashcode for this <code>Point2D</code>. 
* @return  a hash code for this <code>Point2D</code>. 
*/ 
public int hashCode() { 
    long bits = java.lang.Double.doubleToLongBits(getX()); 
    bits ^= java.lang.Double.doubleToLongBits(getY()) * 31; 
    return (((int) bits)^((int) (bits >> 32))); 
} 

Lưu ý rằng câu hỏi "Nó sẽ băm tốt?" khó trả lời, nó phụ thuộc chủ yếu vào mẫu sử dụng.

Bạn có thể truy cập vào mã nguồn của gần như tất cả "lớp học tiêu chuẩn Java", chỉ cần tìm kiếm các src.zip tập tin trong thư mục cài đặt JDK của bạn (hoặc sử dụng một IDE như Eclipse/NetBeans và nhấn F3 vào tên lớp).

+1

Đây là, bằng cách này, không phải là một thực hiện mã băm xấu, vì nó đi. Không phải những gì tôi sẽ gọi là an toàn chống lại một cuộc tấn công có chủ ý, nhưng hoàn toàn tốt cho việc sử dụng hàng ngày. –

+0

Cảm ơn bạn !!!!!!!!! – Tim

+0

@Louis Wasserman: Lưu ý rằng tôi đã không nói nó là xấu, tôi đã đề cập đến câu hỏi của Tim _ "Tôi muốn chắc chắn rằng nó sẽ băm tốt" _. Tôi tin rằng người ta không nên chạm vào hành vi được xác định trước, họ nên nói chung là đủ. Theo kinh nghiệm của tôi, sau khi profiling nó luôn luôn sôi xuống một số phần khác của mã gây ra nút cổ chai. – rlegendi

3

Có cách nào để thực sự xem mã nguồn của các lớp java tiêu chuẩn không?

Có - Tôi tin rằng nó thường đi kèm với JDK, trong tệp src.zip trong thư mục JDK của bạn. Nếu không, thì cách lấy nó sẽ phụ thuộc vào phiên bản Java bạn đang sử dụng. Nguồn JDK 6 đầy đủ có sẵn here chẳng hạn, hoặc JDK 7 có một số source code download page riêng biệt với các tùy chọn khác nhau.

Đối với mức băm tốt như thế nào - tại sao không thử nghiệm bằng một mẫu của thực tế điểm? Sẽ luôn luôn có khả năng va chạm, nhưng liệu chúng có thực sự xảy ra hay không sẽ phụ thuộc vào dữ liệu của bạn. Một cách dễ dàng để tìm ra cách băm không có va chạm trong trường hợp của bạn là sử dụng Multiset từ Guava - thêm mã băm từ mỗi điểm vào tập hợp, và sau đó về cơ bản sẽ cung cấp cho bạn tần suất của mỗi mã băm.

Thành thật mà nói, tôi muốn mong đợi thuật toán băm khá hợp lý để sử dụng cho mục đích chung. Nhưng thử nghiệm luôn luôn là một ý tưởng tốt nếu bạn đang quan tâm.

1

Đi tới số link này và tìm kiếm Java SE 6 JDK Source Code. Tải xuống nguồn và đọc nó cho chính bạn. Tôi nghi ngờ bạn sẽ làm tốt hơn nhưng nó là tốt để hoài nghi.

+0

bạn cũng có thể vào đây và sử dụng hộp tìm kiếm: http://grepcode.com/ – DPM

3

Mã nguồn Java đi kèm với tệp JDK trong tệp src.zip. Lưu ý rằng Point 's hashCode() được xác định trong phụ huynh của nó, java.awt.geom.Point2D.

Nếu bạn quyết định việc thực hiện hiện không phải là đạt tiêu chuẩn của bạn, bạn có thể muốn ghi đè lên các phương pháp hashCode sử dụng một lớp vô danh, được xác định "on the fly":

Point myPoint = new Point() { 

    public int hashCode() { 
     // custom implementation 
    } 

}; // <-- note required semicolon 

Bằng cách này bạn thắng' t phải tạo một tập tin mới.

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