2012-09-16 40 views
5

Khi bạn nối một chuỗi với một số nguyên thủy như int, trước tiên hãy tự động hộp số tự động giá trị.Ghép nối chuỗi và hộp số tự động trong Java

ví dụ:

String string = "Four" + 4; 

Làm thế nào để nó chuyển đổi các giá trị cho một chuỗi trong Java?

+0

Bạn đang sử dụng ngôn ngữ nào? – skunkfrukt

+0

Hình như Java để tôi – TeaOverflow

+0

nếu bạn nói về C#, nhìn vào đây: [chuỗi concat] [1] [1]: http: // stackoverflow.com/questions/3398604/string-string-int-whats-đằng sau-cảnh-c – meirrav

Trả lời

5

Để xem những gì các trình biên dịch Java tạo ra nó luôn luôn là hữu ích để sử dụng javap -c để hiển thị các bytecode thực tế sản xuất:

Ví dụ đoạn code Java sau:

String s1 = "Four" + 4; 
int i = 4; 
String s2 = "Four" + i; 

sẽ tạo ra các bytecode sau:

0: ldc  #2; //String Four4 
    2: astore_1 
    3: iconst_4 
    4: istore_2 
    5: new  #3; //class java/lang/StringBuilder 
    8: dup 
    9: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    12: ldc  #5; //String Four 
    14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    17: iload_2 
    18: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan 
g/StringBuilder; 
    21: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    24: astore_3 
    25: return 

Từ điều này chúng ta có thể thấy:

  • Trong trường hợp của "Four" + 4, trình biên dịch Java (Tôi đã sử dụng JDK 6) là đủ thông minh để suy ra rằng đây là một hằng số, vì vậy không có nỗ lực tính toán tại thời gian chạy, như chuỗi được nối tại thời gian biên dịch
  • Trong trường hợp của "Four" + i, mã tương đương là new StringBuilder().append("Four").append(i).toString()
  • Tự động đóng hộp không được tham gia ở đây vì có phương thức StringBuilder.append(int) theo tài liệu đang sử dụng String.valueOf(int) để tạo biểu diễn chuỗi của số nguyên.
4

Trình biên dịch java thực sự tạo một StringBuilder và gọi phương thức append(). Nó có thể được nhìn thấy trong các byte-code:

22 invokespecial java.lang.StringBuilder(java.lang.String) [40] 
... 
29 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [47] 
32 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [51] 

Tuy nhiên, hành vi này là giống hệt nhau lại sàn đấu và sau đó gọi toString(): "Four" + new Integer(4).toString() - mà tôi tin những gì các nhà thiết kế ngôn ngữ đã có trong tâm trí.


(1) Chính xác hơn, các biên dịch đã concatting chuỗi chữ và int đen thành một chuỗi đơn đen "Four4". Bạn có thể nhìn thấy nó trong các mã byte trong dòng sau trong byte-code:

0 ldc <String "Four4"> [19] 
0

Theo http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html, autoboxing được thực hiện trên các loại nguyên thủy bất cứ khi nào một loại tài liệu tham khảo là cần thiết (chẳng hạn như lớp Integer trong trường hợp này)

Vì vậy, int sẽ được chuyển đổi thành một số nguyên thì đối tượng số nguyên toString() được gọi và kết quả của nó được nối thêm vào chuỗi trước đó.

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