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?
Trả lời
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).
Đâ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. –
Cảm ơn bạn !!!!!!!!! – Tim
@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
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.
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.
- 1. Tôi có cần phương thức equals và Hashcode không nếu lớp của tôi thực hiện so sánh được trong Java?
- 2. Tôi có thể ghi đè nội dòng hay không!
- 3. Tôi có thể ghi đè lên một phương thức ẩn (nhưng công khai) và gọi phương thức siêu của nó không?
- 4. Định vị tuyệt đối có phải là phương pháp hay nhất hay tôi nên tránh nó?
- 5. Làm thế nào tôi có thể ghi đè lên phương thức toString của một ArrayList trong Java?
- 6. Tôi có nên ghi đè lên ExecutionContext mặc định không?
- 7. Java hashCode cho một lớp Point
- 8. Tôi có nên đóng cURL hay không?
- 9. Ghi đè hashCode() - điều này có đủ tốt không?
- 10. Hibernate: Tôi có nên bao gồm trường 'phiên bản' thành phương thức hashcode() và equals()
- 11. Tôi có thể ghi đè lên @RequestMapping trên một kiểu cho một phương thức không?
- 12. Tôi có nên ghi đè lên dịch vụ() hoặc doPost() không?
- 13. Tôi có nên gọi [super superMethod] sau mã của riêng tôi hoặc trước mã không?
- 14. Tôi có nên sử dụng nguyên mẫu hay không?
- 15. Nếu tôi ghi đè lên window.onerror trong javascript, tôi có nên trả về true hoặc false không?
- 16. Tại sao tôi nhận được "phải ghi đè lên một phương thức siêu lớp" với @Override?
- 17. Truy vấn phương thức ẩn của NSURLParameters có thể ghi đè lên danh mục
- 18. Tạo phương thức hashCode() - Java
- 19. Tôi có nên trỏ từ một lớp dẫn xuất riêng đến lớp cơ sở của nó không?
- 20. Tôi có nên sử dụng typeclasses hay không?
- 21. Siêu lớp có không gọi phương thức ghi đè không?
- 22. Tôi có nên gọi thực hiện lớp cơ sở khi ghi đè một phương thức trong C# cho ASP.NET?
- 23. Khi nào tôi nên sử dụng phân đoạn phương thức java 5 của Lớp?
- 24. Gọi phương thức ghi đè, siêu lớp cuộc gọi đã ghi đè phương thức
- 25. Có thể ghi đè lên một phương thức tĩnh trong lớp dẫn xuất không?
- 26. Java - Có ok để có phương thức chuyển các giá trị trường riêng vào phương thức của lớp khác không?
- 27. ghi đè bằng phương thức() của Pair
- 28. Tôi có nên sử dụng một khung công tác hoặc viết MVC của riêng mình không?
- 29. Ghi đè phương thức gửi của XMLHttpRequest
- 30. Trong Gobject, cách ghi đè lên phương thức của lớp cha thuộc về một giao diện?
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
Nguồn nằm trong 'src.zip' trong thư mục JDK của bạn. –
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