2013-02-28 34 views
40

Nếu một người không ghi đè phương pháp hashCode, triển khai mặc định là gì hashCode?Triển khai mặc định của `hashCode` là gì?

+0

Giới thiệu về impl mặc định ementation bạn có thể đọc [this] (http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx) – CAMOBAP

+1

thực hiện mặc định là JVM cụ thể, nhưng nói chung nó trả về 'các đối tượng trả về. băm (this.field1, this.field2, this.field3, v.v.); ' – NoName

Trả lời

38

Sau đó, lớp này kế thừa hashCode từ một trong các tổ tiên của nó. Nếu không ghi đè, thì Object.hashCode sẽ được sử dụng.

Từ docs:

Càng nhiều càng tốt là hợp lý thực tế, phương thức hashCode định nghĩa bởi lớp Object không trở lại số nguyên phân biệt cho các đối tượng khác nhau. (Điều này thường được thực hiện bằng cách chuyển đổi địa chỉ nội bộ của đối tượng vào một số nguyên, nhưng kỹ thuật thực hiện điều này là không cần thiết bởi các ngôn ngữ lập trình JavaTM.)

thực hiện Vì vậy, mặc định là JVM cụ thể

+0

Cảm ơn bạn, vâng. Việc thực hiện 'Object.hashCode() trông như thế nào? –

+1

@JohnThreepwood nó là một chi tiết thực hiện, bạn cần phải giải quyết tài liệu JVM của bạn cho điều đó. –

+2

http://stackoverflow.com/a/32454673/6785908 –

3

Object. hashcode() là một phương thức gốc.

public native int hashCode();

Điều đó có nghĩa nó thực hiện trong mã cụ nền tảng và được tiếp xúc như một phương pháp tự nhiên.

mã cho cùng sẽ là một mã biên dịch và không có sẵn withing JDK

existing question này có thể cung cấp thêm thông tin.

14

Theo mặc định, các phương pháp không được ghi đè lên được kế thừa từ Object.

Nếu bạn xem tài liệu của phương pháp đó, giá trị trả lại là "[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])". Phương thức trong java.lang.Object được khai báo là có nguồn gốc, có nghĩa là việc triển khai được cung cấp bởi JVM và có thể khác nhau tùy thuộc vào môi trường thời gian chạy của bạn.

Một ví dụ nhỏ:

Object o1 = new Object(); 
Object o2 = new Object(); 
System.out.println(o1.hashCode()); 
System.out.println(o2.hashCode()); 

in (sử dụng jdk6 của tôi):

1660187542 
516992923 

Một Hex đại diện của các giá trị hashCode() được sử dụng trong việc thực hiện mặc định của toString() bằng cách này: Chạy System.out.println(o1) in một cái gì đó như

[email protected] 
+0

Giải thích tốt. – chipmunk

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