2012-06-24 27 views
6

Có bao nhiêu đối tượng chuỗi sẽ được tạo bởi mã sau?Có bao nhiêu đối tượng chuỗi sẽ được tạo trong bộ nhớ?

String s=""; 
s+=new String("a"); 
s+="b"; 

Tôi có câu hỏi này lúc kiểm tra. Tôi muốn biết câu trả lời đúng. Tôi nói 2 đồ vật.
Đối tượng từ nhóm chứa "", "b" và đối tượng được tạo bởi Chuỗi mới ("a");

+3

'b' là gì? Chúng tôi không thể trả lời câu hỏi của bạn mà không biết điều đó. –

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28java.lang.String%29 –

Trả lời

8

Chuỗi s = "";

không tạo đối tượng nào.

s + = new String ("a");

tạo năm đối tượng. các new String, StringBuilder và char [] của nó và Chuỗi kết quả và char của nó []

s + = "b";

tạo ra bốn đối tượng, StringBuilder và char của nó [] và Chuỗi kết quả và char của nó []

Vì vậy, tôi có được một tổng số chín đối tượng trong số đó là ba chuỗi các đối tượng

Lưu ý: Bạn có thể chắc chắn rằng "" đã được nạp như nó xuất hiện trong nhiều lớp hệ thống bao gồm ClassLoader và Class.

Các chuỗi "a" và "b" có thể hoặc không được coi là chuỗi mới cho mục đích của câu hỏi này. IMHO Tôi sẽ không tính chúng vì chúng sẽ chỉ được tạo ra nhiều nhất một lần và nếu mã này chỉ chạy một lần, nó hầu như không quan trọng có bao nhiêu chuỗi được tạo ra. Có nhiều khả năng hữu ích hơn là biết có bao nhiêu đối tượng được tạo mỗi khi mã được chạy.

+0

Mã không biên dịch (cụ thể hơn dòng sau đây ' s + = new String ("a"); '). Làm thế nào bạn thậm chí quản lý để đếm số lượng các đối tượng được tạo ra trong thời gian chạy? –

+6

Câu hỏi là về các cá thể String. Không chỉ đối tượng. –

+0

@DarinDimitrov IDE và trình biên dịch của tôi cho biết nó biên dịch. Điều gì được cho là vấn đề? –

9

tôi sẽ anwser khác, câu hỏi rõ ràng hơn: có bao nhiêu trường hợp String được tham gia vào đoạn mã sau:

String s=""; 
s+=new String("a"); 
s+="b"; 

Và câu trả lời là 6:

  • String trống đen: "";
  • Chuỗi ký tự "a";
  • bản sao của chuỗi ký tự "a": new String("a");
  • Chuỗi được tạo bằng cách ghép s và bản sao của "a";
  • Chuỗi ký tự "b"
  • Chuỗi được tạo bởi concatenating s"b".

Nếu bạn giả định rằng ba chuỗi ký tự String đã được tạo bởi mã được tải trước đó, đoạn mã do đó tạo ra 3 thể hiện String mới.

+0

Chuỗi s1 = Chuỗi mới ("hello"); , có bao nhiêu tham chiếu được tạo ở cấp JVM? Tôi biết hai đối tượng: 1 tại thời điểm tải lớp cho "hello" và 1 tại thời điểm thực thi lệnh. 1 tham chiếu là s1, nghi ngờ của tôi là cũng có tham chiếu thứ 2 s2 là kết quả của chuỗi "hello" khi tải lớp được chuyển tới hàm tạo mới String(). Trong java, không có cách nào chúng ta có thể truyền một đối tượng trong một hàm hoặc hàm khởi tạo, chúng ta chỉ có thể chuyển một tham chiếu. Ngoài ra, cần có một tham chiếu thứ 3 s3, mà nên là kết quả của chuỗi mới ("hello") và sau đó đã được gán cho s1? –

0

Số đối tượng thực sự được tạo trong tình huống JITC không xác định.JITC cũng có thể nhận ra rằng new String("a") là một danh tính và không có giá trị trung gian nào của s được tham chiếu, do đó chỉ có StringBuilder được tạo. Có một số tác dụng phụ tiềm ẩn phải được bắt chước trong trường hợp chung (ví dụ: đối số cho new String() có thể không hợp lệ), nhưng với các chữ mà chúng không thể xảy ra.

Thực tế, javac có thể nhận ra rằng kết quả là "ab", không có tác dụng phụ tiềm ẩn, và chỉ tạo ra một chuỗi ký tự có giá trị đó. (Nó chuỗi kết hợp trong những trường hợp hơi ít phức tạp hơn.)

0

Tạo mới Strings

Trước đó chúng tôi hứa sẽ nói thêm về sự khác biệt tinh tế giữa các phương thức khác nhau của việc tạo ra một String. Hãy xem xét một vài ví dụ về cách một String có thể được tạo ra, và chúng ta hãy tiếp tục giả định rằng không có đối tượng String khác tồn tại trong hồ bơi:

String s = "abc"; // creates one String object and one reference variable 

Trong trường hợp đơn giản này, "abc" sẽ đi trong hồ bơi và s sẽ đề cập đến nó.

String s = new String("abc"); // creates two objects, and one reference variable 

Trong trường hợp này, bởi vì chúng tôi sử dụng các từ khóa new, Java sẽ tạo ra một đối tượng String mới trong bình thường (nonpool) bộ nhớ, và s sẽ đề cập đến nó. Ngoài ra, chữ "abc" theo nghĩa đen sẽ được đặt trong hồ bơi.

Từ SCJP Sun Certified Programmer for Java 6 Study Guide (thi 310-065) .pdf

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