2012-08-29 34 views
7

Strcpy trong Java là gì?Strcpy trong Java là gì?

String s1, s2; 

s1 = new String("hello"); 
s2 = s1; // This only copies s1 to s2. 
+3

@ sp00m: Không, đó là không đúng sự thật. Nó sao chép một tham chiếu. Không có gì huyền diệu về Chuỗi trong sự tôn trọng đó - nó chỉ là nó không thay đổi được. Bạn cũng có thể viết các lớp không thay đổi của riêng mình. (Nếu bình luận của bạn là một câu trả lời, tôi đã downvoted nó - nó không chính xác và gây nhầm lẫn.) –

+0

@JonSkeet Được rồi, hiểu rồi. – sp00m

+0

Ý tôi là s2 = s1 chỉ sao chép tham chiếu. Tôi đã chỉnh sửa. – user1301568

Trả lời

13

Tuyên bố này:

s2 = s1; 

bản sao giá trị của s1 vào s2. Giá trị đó chỉ là một tham chiếu, vì vậy bây giờ s1s2 tham chiếu đến cùng một đối tượng. Vì vậy, nếu đây là loại có thể thay đổi (ví dụ: StringBuilder hoặc ArrayList) thì bạn có quyền được quan tâm.

Tuy nhiên, String là không thay đổi. Bạn không thể sửa đổi đối tượng để thay đổi dữ liệu văn bản của nó, vì vậy chỉ cần sao chép tham chiếu là đủ. Thay đổi giá trị của s2 để chỉ một chuỗi khác nhau (hoặc làm cho nó một tham chiếu null) sẽ không thay đổi giá trị của s1:

String s1 = "hello"; 
String s2 = s1; 
s1 = "Something else"; 
System.out.println(s2); // Prints hello 

Nếu bạn thực sự muốn tạo một đối tượng mới String, bạn có thể sử dụng constructor bạn đã (không cần thiết) sử dụng cho s1:

s2 = new String(s1); 

Tuy nhiên, đó là rất hiếm khi một ý tưởng hay.

+0

Tôi tự hỏi: có ai từng gặp phải một ví dụ thực tế về đời sống nơi một bản sao của bản gốc thực sự cần thiết không? – amit

+0

@amit: không phải cho Chuỗi không thay đổi, nhưng vì có lý do chính đáng rõ ràng để sao chép một StringBuffer có thể thay đổi –

+3

@amit: Vâng, tôi đã làm. Khi đọc rất nhiều dòng * rất ngắn * từ một tệp từ điển, các thư viện chuẩn * đã sử dụng * để cấp phát một chuỗi với một mảng sao lưu của ít nhất 80 ký tự. Sự khác biệt trong việc sử dụng bộ nhớ giữa việc thực hiện 'line = new String (line)' và không phải là rất lớn. Tôi tin rằng mọi thứ tốt hơn bây giờ. –

0

Không s2 sẽ tham chiếu đến đối tượng chuỗi mới được tạo cùng với s1.

4

Chuỗi là không thay đổi, do đó bạn sẽ không bao giờ phải sao chép chuỗi. (Trừ những trường hợp hiếm hoi)

ví dụ:

s1 = new String("hello"); 

về cơ bản là giống như

s1 = "hello"; 

s2 = s1; 

được về cơ bản giống như

s2 = "hello"; 
+1

Cảm ơn bạn đã ví dụ dễ dàng. – user1301568

0
   String s1, s2; 

    s1 = new String("hello"); 
    s2 = s1; // This only copies s1 to s2. Am I right? 

    s1="adsfsdaf"; 
    System.out.println(s2); 
    System.out.println(s1); 

bạn là đúng s1 và s2 in chuỗi không cùng chuỗi ... nhưng trong khi làm điều này cho các thay đổi đối tượng được thực hiện trong một đối tượng ảnh hưởng khác ... có nhu cầu sao chép đối tượng ..không có vấn đề gì với chuỗi

+0

Nó sẽ không khác nhau đối với bất kỳ đối tượng nào khác, không thay đổi hay không. Việc gán thứ hai cho s1 là thiết lập một giá trị mới cho tham chiếu (con trỏ), không sửa đổi đối tượng. Sửa đổi đối tượng sẽ giống như 's1.someField = xyz;'. –

+0

ya cho chuỗi đúng ... đối với điều kiện như đối tượng này 0 = new Object(); đối tượng o2 = o; có một nhu cầu của clone .. đó là những gì tôi đã nói – Aravind

+0

"clone" chỉ là cần thiết nếu đối tượng có thể được sửa đổi trong tương lai, và bạn không muốn cho rằng sửa đổi được "nhìn thấy" từ bản sao. Không có gì "huyền diệu" về các đối tượng bất biến - chúng đơn giản là thiếu phương pháp để sửa đổi chúng. –

0

chuỗi Constructor không được công việc rất dễ dàng vì các đối tượng chuỗi trong java là không thay đổi

String st="hello"; 
String st1=new String(st); 

OUTPUT sẽ được st1 là chào

+1

Không có gì để làm với bất biến. Nó chỉ đơn giản là một câu hỏi liệu bạn có được các đối tượng riêng biệt hoặc tham chiếu trùng lặp với cùng một đối tượng hay không. Tính không thay đổi đơn giản có nghĩa là nếu bạn chỉ sao chép tham chiếu mà bạn được đảm bảo rằng không hoạt động nào sau đó có thể thay đổi giá trị của đối tượng. –