Tôi tò mò về cách java tạo giá trị băm bằng cách sử dụng phương thức hashCode() của API đối tượng?Phương thức hashCode() của java hoạt động như thế nào?
Trả lời
Java không tạo hashCode(), tức là không có gì tự động xảy ra ở đây. Tuy nhiên, Object
tạo ra một HashCode dựa trên địa chỉ bộ nhớ của cá thể của đối tượng. Hầu hết các lớp (đặc biệt nếu bạn định sử dụng nó trong bất kỳ API Collection
) nào nên triển khai HashCode của riêng chúng (và theo hợp đồng phương thức bằng của riêng chúng).
hashCode()
của Object
thực sự là một phương pháp gốc và việc triển khai thực sự không phải là Java thuần túy. Bây giờ, về cách thức hoạt động, this answer from Tom Hawtin làm một công việc tuyệt vời tại giải thích nó:
Nhiều người sẽ cho rằng
Object.hashCode
sẽ trả lại địa chỉ của người đại diện đối tượng trong bộ nhớ. Trong các hiện thực hiện đại, các đối tượng thực sự di chuyển trong bộ nhớ. Thay vào đó, một khu vực của tiêu đề đối tượng được sử dụng để lưu trữ giá trị, có thể được bắt nguồn từ địa chỉ bộ nhớ tại thời điểm giá trị được yêu cầu đầu tiên.
Toàn bộ câu trả lời thực sự đáng để đọc.
Theo tài liệu API nền tảng Java, việc tính toán mã băm dựa trên địa chỉ JVM nội bộ 32 bit của đối tượng.
Đúng là đối tượng di chuyển trong khi thực thi (AFAIK lý do duy nhất là bộ thu gom rác). Nhưng hashcode không thay đổi.
Vì vậy, khi bạn có một đối tượng như thế này
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
Trong trường hợp này person1.hashCode sẽ không được tính bằng person2.hashCode vì các địa chỉ bộ nhớ của hai đối tượng này là không giống nhau.
Nhưng person2.hashCode sẽ bằng với person3 vì chúng trỏ đến cùng một đối tượng.
Vì vậy, nếu bạn cần sử dụng phương thức hashCode cho các đối tượng của mình, bạn phải tự thực hiện nó.
Bằng cách thực hiện String.hashCode khác nhau. Nó là một cái gì đó như thế này: (C# cú pháp)
public int hashCode(String str)
{
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
}
chỉnh sửa: Không kiểm tra tràn được thực hiện ở đây, vì vậy hashCode có thể là tích cực hay tiêu cực.
Java không tạo ra ý nghĩa hashCode
cho bạn, đó là công việc của bạn với tư cách là một lập trình viên để tạo ra một hashCode
hữu ích. Mặc định hashCode
chỉ là vị trí bộ nhớ.
Không chính xác - mã băm mặc định được dựa trên vị trí bộ nhớ * lần đầu tiên phương thức này được gọi là * cho đối tượng; xem câu trả lời của @ Pascal. –
Điểm tốt, được ghi nhận hợp lệ. – fastcodejava
Object.hashCode() sử dụng System.identityHashCode() dựa trên số id cho một đối tượng cụ thể.
Hàm HashCode() có một số tùy chọn để tạo mã băm. Nó đặt tham số khởi động JVM.Chức năng, mà tạo hashCode() được viết trên C++, và bạn có thể xem mã here
- HashCode == 0: Đơn giản chỉ cần trả về số ngẫu nhiên không có liên quan đến nơi trong bộ nhớ đối tượng được tìm thấy. Theo như tôi có thể thực hiện, số đọc toàn bộ của hạt giống không được tối ưu cho các hệ thống có nhiều bộ xử lý .
- HashCode == 1: Đếm các giá trị mã băm, không chắc chắn giá trị nào chúng bắt đầu, nhưng có vẻ khá cao.
- HashCode == 2: Luôn trả về mã băm nhận dạng giống hệt nhau 1. Điều này có thể được sử dụng để kiểm tra mã dựa trên nhận dạng đối tượng. Lý do tại sao JavaChampionTest trả về URL của Kirk trong ví dụ trên là tất cả các đối tượng đều trả lại mã băm giống nhau.
- HashCode == 3: Đếm các giá trị mã băm, bắt đầu từ số không. Nó không phải là chủ đề an toàn, vì vậy nhiều luồng có thể tạo ra các đối tượng với cùng mã băm.
- HashCode == 4: Điều này dường như có một số liên quan đến vị trí bộ nhớ mà tại đó đối tượng được tạo.
- HashCode> = 5: Đây là thuật toán mặc định cho Java 8 và có hạt giống cho mỗi chủ đề . Nó sử dụng kế hoạch xor-shift của Marsaglia để tạo ra các số giả ngẫu nhiên .
Các thông tin được lấy từ here
- 1. Tạo phương thức hashCode() - Java
- 2. Phương thức .delay của jQuery hoạt động như thế nào?
- 3. Phương thức .ToString() hoạt động như thế nào?
- 4. Phương thức khởi tạo tĩnh hoạt động như thế nào?
- 5. Pthread_key_t và phương thức pthread_key_create hoạt động như thế nào?
- 6. Phương thức Wicket setResponsePage() hoạt động như thế nào?
- 7. Phương thức ảo hoạt động như thế nào trong C#?
- 8. Phương thức phản đối này hoạt động như thế nào?
- 9. Độ phân giải tên phương thức defrecord của clojure hoạt động như thế nào?
- 10. Phương thức hashCode() trong lớp Object được triển khai như thế nào?
- 11. Các phương thức tĩnh được đồng bộ hóa hoạt động như thế nào trong Java?
- 12. Phương thức equals của Scala hoạt động như thế nào trong trường hợp của Danh sách?
- 13. Phương thức tương đương của mảng hoạt động như thế nào?
- 14. waitUntilObjectExists() Phương thức SDK PHP của Amazon S3, chính xác nó hoạt động như thế nào?
- 15. Tham số phương thức bộ điều khiển MVC của Spring hoạt động như thế nào?
- 16. Kích thước danh sách Java() hoạt động như thế nào?
- 17. Chú thích phương thức Java hoạt động kết hợp với phương pháp ghi đè như thế nào?
- 18. Các chú thích Java này hoạt động như thế nào?
- 19. Lớp Object được triển khai như thế nào (các phương thức như hashCode và các trường nội bộ)?
- 20. Các biểu thức lambda hoạt động như thế nào?
- 21. Phương thức thay thế không hoạt động
- 22. Phương thức nào hoạt động trong Groovy?
- 23. Làm thế nào để thực hiện phương thức equals() và hashcode() trong BaseEntity của JPA?
- 24. Java và Scala hoạt động tốt như thế nào?
- 25. Cách Queryable.OfType hoạt động như thế nào?
- 26. GetContentResolver() hoạt động như thế nào?
- 27. Cách triển khai phương thức hashCode và equals
- 28. Phương thức kết hợp đường ray hoạt động như thế nào?
- 29. Quá tải phương thức. Làm thế nào nó hoạt động?
- 30. Hàng đợi.js hoạt động như thế nào?
Từ file Object.java '(Đây là ** ** thường được thực hiện bằng cách chuyển đổi địa chỉ ** nội ** của đối tượng vào một số nguyên, nhưng việc thực hiện này kỹ thuật ** không ** được yêu cầu bởi ngôn ngữ lập trình Java TM.) '- nhấn mạnh của tôi. –
Mã băm này có trả về giá trị khác sau khi đối tượng được di chuyển khi GC xảy ra không? – Jacky
Ý tưởng rằng hashCode sử dụng địa chỉ bộ nhớ là một vật phẩm lịch sử http://stackoverflow.com/questions/36236615/does-object-tostring-or-object-hashcode-ever-give-the-memory-address-of-the -obje – Raedwald