2013-02-22 11 views
9

Các chuỗi Java không thay đổi được và tạo nhiều chuỗi với cùng một giá trị trả về cùng một con trỏ đối tượng. (Có một thuật ngữ cho việc này không? "Gộp" có vẻ phù hợp, nhưng điều đó đã đề cập đến việc lưu bộ nhớ đệm để tiết kiệm thời gian bằng cách thực hiện ít instantiations hơn.)Java có tối ưu hóa các đối tượng không thay đổi được không?

Java cũng làm điều này (điều không có thuật ngữ) với khác (người dùng định nghĩa) các lớp học không thay đổi? Thậm chí Java có thể phát hiện ra rằng một lớp là bất biến, hay là cái gì đó duy nhất cho lớp chuỗi?

+0

+1 Câu hỏi thú vị. Tôi tin rằng Java có thể nhận ra các lớp học chỉ có các thành viên cuối cùng và đối xử với họ là không thay đổi, nhưng tôi không có thông tin chính xác về điều đó. Tôi sẽ để ý đến câu hỏi này. Cảm ơn bạn – gd1

+2

Nó không, và xem xét những gì sẽ xảy ra nếu bạn thay đổi các đối tượng bất biến anyway, với sự phản ánh .. – harold

+0

Tôi thấy, tôi là một chút ngạc nhiên về điều đó. Cảm ơn – gd1

Trả lời

7

Wrt. Chuỗi, từ bạn đang tìm kiếm là interning.

Java sẽ không làm điều này cho các đối tượng bất biến của riêng bạn. Mặc dù vậy, nó có các phiên bản mặc định của các nguyên thủy đóng hộp. Xem bài viết này trên wrapper class caching để biết thêm thông tin.

0

Chuỗi Thực hiện là duy nhất đối với lớp chuỗi. Tôi cho rằng JVM không áp dụng các quy tắc này cho một lớp người dùng định nghĩa.

1

Cụm từ bạn đang tìm kiếm đang lặp lại. Java tối ưu hóa chuỗi "tự động", trong quá trình biên dịch và cung cấp cho các nhà phát triển khả năng để làm điều đó trong thời gian chạy. (Chi tiết về những gì được tối ưu hóa khi phụ thuộc vào phiên bản JVM.)

Đối với các đối tượng không thay đổi. Tôi không nghĩ rằng Java hỗ trợ bất kỳ loại cơ chế nào sẽ giải quyết cùng một instace. Loại chuỗi không phải là ngoại lệ của quy tắc này.

Lý do tại sao, là bạn phải sử dụng toán tử new để tạo một phiên bản. Nếu bạn sử dụng new để tạo cá thể chuỗi, bạn sẽ luôn nhận được hai đối tượng khác nhau.

Việc liên kết chỉ khả dụng cho loại Chuỗi. Nhưng khái niệm này là miễn phí, bạn có thể thêm vào lớp học không thay đổi của bạn phương pháp như vậy và viết một phương pháp compled mà sẽ làm điều tương tự.

2

Như những người khác ở đây đã nói quá trình này với Strings được gọi là interning.

nó đáng nói rằng hành vi của Strings với các giá trị văn chương cùng là cùng một đối tượng có thể hoặc không có thể đúng trong Java 7. Từ 7 trở đi:

Trong JDK 7, thực tập nội trú chuỗi không còn được cấp phát trong thế hệ thường trú của vùng heap Java, nhưng thay vào đó được cấp phát trong phần chính của vùng heap Java (được gọi là các thế hệ trẻ và cũ), cùng với các đối tượng khác được ứng dụng tạo ra. Thay đổi này sẽ dẫn đến nhiều dữ liệu cư trú trong vùng heap Java chính và ít dữ liệu hơn trong thế hệ vĩnh viễn và do đó có thể yêu cầu điều chỉnh kích thước heap. Hầu hết các ứng dụng sẽ chỉ thấy sự khác biệt tương đối nhỏ trong việc sử dụng đống do thay đổi này, nhưng các ứng dụng lớn hơn tải nhiều lớp hoặc sử dụng nhiều phương thức String.intern() sẽ thấy sự khác biệt đáng kể hơn.

Hãy xem Java SE 7 RFE để biết đầy đủ chi tiết về điều này.

Đối với các đối tượng bất biến của riêng bạn Java không làm gì đặc biệt với chúng - nó không biết rằng chúng không thay đổi. Nó có thể có thể phương pháp nội tuyến nhiều hơn một chút nếu nó có thể phát hiện ra rằng nó có giá trị/có thể, nhưng như xa trình biên dịch và JVM có liên quan họ chỉ là một đối tượng khác.

+2

Wow, downvoted? Tôi có thể nhận được một lời bình luận, nhưng sẽ rất hay khi biết tại sao –