2013-12-11 17 views
55

Các câu sau đây,Concatenation của Strings và các nhân vật

String string = "string"; 

string = string +((char)65) + 5; 
System.out.println(string); 

Sản xuất sản lượng stringA5.


tuy nhiên Sau đây,

String string = "string"; 

string += ((char)65) + 5; 
System.out.println(string); 

Sản xuất string70.

Sự khác biệt ở đâu?

Trả lời

69

Bạn thấy hành vi này là kết quả của sự kết hợp ưu tiên toán tử và chuyển đổi chuỗi.

JLS 15.18.1 trạng thái:

Nếu chỉ có một biểu hiện toán hạng có kiểu String, sau đó chuỗi chuyển đổi (§5.1.11) được thực hiện trên các toán hạng khác để tạo ra một chuỗi thời gian chạy.

Do đó các toán hạng bên tay phải trong biểu hiện đầu tiên của bạn đang ngầm chuyển thành chuỗi: string = string + ((char)65) + 5;

Đối với biểu thức thứ hai tuy nhiên string += ((char)65) + 5; toán tử gán += hợp chất này phải được xem xét cùng với +. Vì += yếu hơn +, toán tử + được đánh giá trước tiên. Ở đó, chúng tôi có một số charint kết quả là binary numeric promotion đến int. Chỉ sau đó += được đánh giá, nhưng tại thời điểm này kết quả của biểu thức liên quan đến toán tử + đã được đánh giá.

+1

+1. Câu trả lời chi tiết và có nguồn gốc. – Maroun

+2

Nên được upvoted cao hơn –

+0

@Gray bạn là đúng, cảm ơn. Đã sửa. –

16

Trường hợp 1

string = string +((char)65) + 5; 

tất cả mọi thứ được coi là chuỗi nhưng trong trường hợp thứ hai

Chuỗi các hoạt động biểu diễn:

  • string +((char)65 = stringA
  • stringA + 5 = stringA5

Trường hợp 2

string += ((char)65) + 5; 

đầu tiên bên tay phải được tính toán có nghĩa là hoạt động đầu tiên sẽ như thế nào ((char)65) + 5, Vì vậy, kết quả của ((char)65) + 5 is 70 và sau đó + = hoạt động.

Chuỗi các hoạt động biểu diễn:

  • (char)65 + 5 = 70
  • string + 70 = string70

Hãy xem ví dụ 1 hơn

String string = "string"; 
string += ((char)65) + 5 + "A"; 
System.out.println(string); 

Output string70A

Lý do Cùng đầu tiên bên tay phải được tính toán và sequesce của opertion thực hiện là

  • (char)65 + 5 = 70
  • 70 + "A" = 70A
  • string + 70A = string70A
+1

Vì vậy, nó có phải làm điều gì đó với ưu tiên người vận hành không? – Tiny

+0

Có, Hoạt động luôn được thực hiện trên cơ sở ưu tiên của toán tử. + = loại toán tử này được giải quyết sau khi thỏa thuận đánh giá bên phải. –

5

Khi bạn viết:

string = string + ((char)65) + 5; 

Nó giống như viết:

String string = 
    new StringBuilder(string).append((char)65).append((int)5).toString(); 

nào cũng giống như phụ string-A (Các đại diện char của số thập phân 65) và 5.

Trong trường hợp sau, bạn đang đầu tiên tính toán tay phải, và sau đó thêm kết quả để string, nó giống như viết:

string = string + 70; 
2
string = string +((char)65) + 5; 

Điều này có nghĩa "Đặt chuỗi nối của string, ((char)65)5. " Đây được đánh giá từ trái sang phải (vì vậy đầu tiên string + ((char)65), sau đó +5 đó, và nối của một chuỗi và một số nguyên chuyển đổi số nguyên thành một chuỗi.

string += ((char)65) + 5; 

này có nghĩa là "Tính toán kết quả của ((char)65)+5 và thêm nó để chuỗi "- toàn bộ bên tay phải được đánh giá trước khi thêm kết quả vào chuỗi. Kể từ khi char thực sự chỉ là một số nguyên 16 bit, nó thêm chúng lại với nhau như số nguyên - cho 70 - và sau đó nó nối thêm vào string .

0

Đó là trường hợp tương tự như ví dụ:

System.out.println("abc"+10 + 5); 

sản xuất abc105 (thêm như String)

System.out.println(5 + 10); 

sản xuất 15 (thêm bao Số)

Các String bao gồm trong (nơi đầu tiên của) hoạt động lực lượng tất cả các yếu tố để được treate d là Strings trong khi thực hiện thao tác. Trong trường hợp của bạn với += tuy nhiên, hoạt động được thực hiện đầu tiên ở phần bên phải (xử lý các phần tử là int) vì ưu tiên của toán tử và sau đó được nối với String.

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