2012-02-17 32 views
7

Nó xuất hiện trong java.lang.String.java, Java sẽ chỉ tạo mã băm, sau đó lưu trữ nó, sau khi gọi hàm băm(), nhưng tại sao không chỉ tạo hashcode trong hàm tạo?Tại sao mã băm Java chuỗi lười biếng được tạo ra?

Mã liên quan:

if (h == 0 && count > 0) { 
    int off = offset; 
    char val[] = value; 
    int len = count; 

    for (int i = 0; i < len; i++) { 
     h = 31*h + val[off++]; 
    } 

    hash = h; 
} 

có thể cho hầu hết các phần được đặt trong các nhà xây dựng.

+0

Nếu bạn tìm thấy câu trả lời có thể chấp nhận, bạn có thể đánh dấu để cho mọi người biết bạn có câu trả lời cho câu hỏi của bạn. –

Trả lời

13

Tại sao lại dành thời gian tạo mã băm có nhiều khả năng sẽ không được sử dụng? Hầu hết các chuỗi được xây dựng, sử dụng và sau đó thu thập rác mà không có hashcode() bao giờ được gọi.

+0

Nhiều chuỗi sẽ được kiểm tra bình đẳng trong cuộc đời của họ. Kiểm tra hai chuỗi bất bình đẳng để bình đẳng nếu mã băm của chúng đã được tính toán thường rất nhanh. Hơn nữa, đối với một số triển khai hashcode, bao gồm một trong Java, có thể tính toán mã băm để nối hai chuỗi trong thời gian không đổi (thực ra là thời gian O (lgN), nhưng số lượng đó bị giới hạn và thuật ngữ không đổi có thể khá nhỏ). – supercat

0

Đây không phải là diễn đàn chính xác cho điều này và câu hỏi có thể sẽ bị đóng. Bạn có thể thử hỏi trong programmers.stackexchange.com.

Một lý do có thể là hashCode tính toán không rẻ và chỉ bắt buộc trong một số trường hợp.

4

Joshua Bloch gọi thực tiễn này là 'kiểm tra đơn độc nhất'.

Jeremy Manson có lời giải thích tuyệt vời của lý do tại sao nó được thực hiện và tại sao it'safe: on his blog

Về bản chất, vào thời điểm xây dựng giúp bạn tiết kiệm thời gian bằng cách bỏ qua tính mã băm. Trong môi trường đa luồng bạn sẽ trả tiền cho việc này vì nhiều luồng có khả năng có thể thực hiện cùng một phép tính.

0

2 lý do:

1) Computing hashCode() là không hề rẻ: là một O(n) phức tạp trên chiều dài của chuỗi, vì vậy tốt hơn làm điều đó chỉ khi cần đến nó.

và:

2) trường hợp Chuỗi là không thay đổi: Vì họ không bao giờ thay đổi, bạn luôn có tính hashCode() nhiều nhất là một lần.

0

Không có lợi ích khi đặt nó trong hàm tạo. Nhưng có một nhược điểm khi nó sẽ có trong constructor. Khi hashCode cho một String không bao giờ được gọi thì tính toán được thực hiện cho không có gì. Và khi bạn gọi hàm hashCode() thì nó được tính một lần trong cả hai trường hợp - chỉ ở những nơi và thời gian khác nhau.

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