2013-04-01 20 views
5
String x = new String("xyz"); 
String y = "abc"; 
x = x + y; 

Có bao nhiêu đối tượng String sẽ được tạo trong mã này?Có bao nhiêu đối tượng String sẽ được tạo ở đây?

+4

Vui lòng cho chúng tôi biết cách bạn lấy được ý tưởng rằng sẽ có hai đối tượng. –

+0

3 và tôi bỏ phiếu để đóng. – partlov

+0

Ba. Các chuỗi không thay đổi, do đó việc gán lại tạo một String khác. – Makoto

Trả lời

12

Sẽ có ít nhất bốn đối tượng:

  • Các thực tập nội trú chuỗi "xyz"
  • Bản sao của thực tập nội trú "xyz" chuỗi
  • Các thực tập nội trú chuỗi "abc"
  • Kết quả của concatenating hai chuỗi.
+0

'x + y' sẽ đánh giá 'xyzabc'. Đối tượng này sẽ được lưu trữ trong' Chuỗi nhóm '. Và sau đó 'new String (" xyzabc ");' sẽ được gọi là kết quả trong một đối tượng chuỗi trên heap, tham chiếu của nó được trả về 'x'. Vì vậy, có 5 đối tượng. Câu trả lời của tôi dựa trên 'constructor string (String original) code' công khai [từ tham chiếu này] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/ java/lang/String.java # String.% 3Cinit% 3E% 28java.lang.String% 29) –

7
String x = new String("xyz"); 

Có một: "xyz" là chuỗi nội bộ.
Có hai: new String("xyz").

String y = "abc"; 

Có ba: "abc" là chuỗi nội bộ.

x = x + y; 

Có bốn. Vì chuỗi là bất biến nên đối tượng chuỗi thứ ba phải được tạo: new String("xyzabc").

Có thể có thể có một đối tượng thứ năm, bởi vì trình biên dịch có thể sử dụng một StringBuilder để thực hiện nối chuỗi.

StringBuilder s = new StringBuilder(x); 
s.append(y); 
x = s.toString(); 
+0

Nhưng là sự sao lưu 'char []' được chia sẻ giữa 'StringBuilder' và' String'. Đó là một câu hỏi vô nghĩa. –

+0

@ TomHawtin-tackline. 1) Tôi nghĩ rằng phụ thuộc vào phiên bản của Java, phải không? 2) Có nó là ... loại. –

6

Khi lớp được tải, hai đối tượng String được tạo (rất có thể), một đối tượng cho mỗi chuỗi ký tự. Đây là một điều một lần ...

Mỗi lần mã được chạy, hai Strings được tạo ra:

  • Các new String("xyz") tạo ra một chuỗi mới có trạng thái là giống như "xyz" chữ.

  • Ghép chuỗi x + y tạo chuỗi mới thứ hai.

Cần lưu ý rằng String y = "abc"; KHÔNG tạo chuỗi mới. Thay vào đó, nó gán tham chiếu đến một Chuỗi hiện có đến y. Trong thực tế, nó là tham chiếu đến đối tượng String cho chữ được tạo khi lớp được nạp.


Thực ra, nếu bạn đi sâu, sẽ có một mảng char[] được tạo cho mỗi đối tượng String được tạo. Và việc ghép nối chuỗi có thể liên quan đến việc tạo đối tượng StringBuilder tạm thời. Cả hai đều là chi tiết triển khai.

Cũng có thể tải lớp có thể không dẫn đến việc tạo tạo đối tượng Chuỗi mới.Đúng là các chuỗi ký tự String sẽ được đại diện bởi String Objects trong nhóm chuỗi, tuy nhiên quá trình chính xác như thế nào xảy ra là chi tiết thực hiện ... và không cần nhất thiết phải gọi String.intern trên đối tượng String mới được tạo .


Và một câu trả lời khác là các đối tượng ZERO được tạo. Đó chỉ là mã nguồn Java và mã nguồn Java không tạo ra các đối tượng trừ khi bạn biên dịch nó và chạy nó. (Tada !!)

+0

Nó không phải là chữ "xyz", nhưng "abc" – FazoM

+1

@fazomisiek - Tôi không hiểu bạn đang nói gì. (Tôi nghĩ bạn có thể đã hiểu sai những gì tôi đã viết ...) –

1

x: khi bạn đang sử dụng các từ khóa mới và constructor của lớp String một đối tượng String được tạo ra

"abc": là một chuỗi chữ và Java tạo ra một đối tượng String bất cứ khi nào nó gặp một chuỗi chữ.

x: nối hai chuỗi được chuyển thành StringBuilder.append (X) .append (Y) .toString(), do đó một đối tượng khác được tạo tại đây.

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