2013-08-07 42 views
10

Đối với câu lệnh bên dưới trong một chương trình, có bao nhiêu đối tượng sẽ được tạo trong bộ nhớ heap và trong nhóm hằng số chuỗi?Vòng đời đối tượng trong quản lý bộ nhớ java và bộ nhớ?

Tôi cần sự rõ ràng trong việc tạo đối tượng. Nhiều nguồn tôi đã đọc không được xây dựng. Tôi bối rối khi đối tượng bị phá hủy.

String a="MAM"+"BCD"+"EFG"+"GFE"; 

Có bao nhiêu đối tượng sẽ được tạo?

Tôi đang tìm kiếm tài liệu tốt về vòng đời của các đối tượng, phương pháp và lớp và cách JVM xử lý chúng khi chúng được thay đổi và sửa đổi động.

+0

Bạn nghĩ sao? –

+0

Ai đó chỉ cần chạy 'javah' trên đó. Tôi cá rằng nó sẽ chỉ hiển thị một hằng số. – Rekin

+0

tối đa tôi chỉ có một nhưng nhiều bạn trong cuộc thảo luận này đã nhầm lẫn tôi [liên kết] (https://www.facebook.com/groups/java.for.developers/10151748401034501/?notif_t=group_comment_reply) – saikiran

Trả lời

3

Đối tượng chính xác được tạo và đặt trong nhóm không đổi, trừ khi nó đã tồn tại, trong trường hợp đó đối tượng hiện có được sử dụng. Trình biên dịch kết nối các hằng số chuỗi với nhau, như được chỉ rõ trong JLS 3.10.5 và 15.28.

Một chuỗi dài đen luôn có thể được chia nhỏ thành từng miếng ngắn hơn và viết như một (có thể trong ngoặc đơn) biểu hiện sử dụng toán tử nối chuỗi +

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

6

Chỉ một đối tượng được tạo.

string s1 = "java"; 
string s2 = "ja" + "va"; 
s.o.p(s1==s2); 

Tuyên bố này đúng.

String s1="java"; 
string s2 = "ja"; 
String s3 = s2 +"va"; 
s.o.p(s1==s3); 

Tuyên bố mang lại giá trị sai.

Vì vậy, một biểu thức tối thiểu phải là vĩnh viễn, sau đó toán tử '+' tạo đối tượng chuỗi mới (trong nhóm không liên tục bằng cách sử dụng new()). Vì vậy, câu hỏi bạn đã hỏi không có câu hỏi thường xuyên. Điều này có nghĩa là nó chỉ tạo ra một đối tượng.

20

"MAM"+"BCD"+"EFG"+"GFE" là một thời gian biên dịch biểu thức liên tục và nó biên dịch thành "MAMBCDEFGGFE" chuỗi chữ. JVM sẽ tạo một thể hiện của String từ chữ này khi tải lớp chứa mã trên và sẽ đặt số này String vào nhóm chuỗi. Do đó String a = "MAM"+"BCD"+"EFG"+"GFE"; không tạo bất kỳ đối tượng nào, hãy xem JLS 15.18.1. String Concatenation Operator +

Đối tượng String mới được tạo (§12.5) trừ khi biểu thức là biểu thức hằng số biên dịch (§15.28).

Đơn giản chỉ cần gán một tham chiếu đến String đối tượng trong hồ bơi đến địa phương var a.

+0

Tôi đã có khái niệm bây giờ nhờ @Evgeniy – saikiran

2

Chỉ một đối tượng sẽ được tạo từ String a sẽ biên dịch thành "MAMBCDEFGGFE".

0

Câu trả lời cho biết một đối tượng heap đơn trong ví dụ của bạn là chính xác. Tuy nhiên, hãy xem xét mã này:

public class Tester 
{ 
    public String a="MAM"; 
    public String b ="BCD"; 
    public String c = "EFG"; 
    public String d ="GFE"; 

    public Tester() 
    { 
     String abcd = a + b + c + d; 
    } 
} 

Trong ví dụ này, có 7 chuỗi được tạo. a, b, c và d không được biên dịch thành một hằng số duy nhất - chúng là thành viên. Sau đó, 1 chuỗi được tạo cho mỗi toán tử + - nói theo ngữ nghĩa, + là một kết nối nhưng một cách hợp lý, nó đang tạo chuỗi mới trong bộ nhớ.2 toán tử đầu tiên được loại bỏ ngay lập tức và bây giờ đủ điều kiện để thu thập rác nhưng bộ nhớ vẫn hoạt động.

Về mặt kỹ thuật có đối tượng thứ 8. Ví dụ của Tester.

Chỉnh sửa: Điều này đã được chứng minh là vô nghĩa trong các ý kiến ​​

+3

Trình biên dịch javac có tối ưu hóa: Không phải mỗi '+' tạo ra một chuỗi mới. Một 'StringBuilder' nội bộ đã được tạo ra,' a', 'b',' c', 'c' được nối thêm và sau đó một' Chuỗi' được tạo ra. Tối ưu hóa này đã được khoảng hơn một thập kỷ. Vì vậy, tính toán là 5 'String' và 5 liên kết' char [] ', 1' StringBuilder' cộng với ít nhất một liên kết 'char []' - cuối cùng là do thay đổi kích thước động. –

+0

Tôi đã sửa chữa! +1 – Gusdor

+0

u có nghĩa là trước tiên nó sẽ nối thêm dấu + và sau đó xem xét a + b dưới dạng một chuỗi và nối thêm vào c ?? tôi đã không giúp bạn – saikiran

3

Hầu hết các câu trả lời dường như tập trung mà a) diễn tả trọn vẹn là thời gian một biên dịch liên tục và b) mà dòng tự nó không xây dựng một đối tượng mới nhưng chỉ tham chiếu đến một đối tượng.

Tuy nhiên, không ai cho đến nay đã đề cập, rằng String chính nó chứa tham chiếu đến nội bộ char[] (cũng nằm trong hồ bơi không đổi).

Tóm tắt: Có hai đối tượng trong nhóm không đổi (Stringchar[]). Dòng không tạo và cũng không phá hủy bất kỳ đối tượng nào.

Và liên quan đến:

Tôi bối rối khi đối tượng bị tiêu diệt.

Không có đối tượng nào bị hủy, vì nội dung trong hồ bơi không đổi sẽ chỉ bị hủy nếu bản thân lớp đó sẽ bị xóa. Tối đa bạn có thể nói, tham chiếu a sẽ hết hạn.