Các quy tắc chính xác được nêu rõ trong ngôn ngữ Java Specification, §5.1.11. String Conversion
Theo những quy tắc, "str" + bool
tương đương với:
"str" + new Boolean(bool).toString()
Điều đó nói rằng, trình biên dịch được phép mất nhiều thời gian đáng kể trong cách chính xác biểu thức tổng thể được đánh giá. Từ JLS §15.18.1. String Concatenation Operator +:
Thực hiện có thể chọn thực hiện chuyển đổi và ghép nối trong một bước để tránh tạo và loại bỏ đối tượng Chuỗi trung gian. Để tăng hiệu suất của chuỗi nối lặp lại, trình biên dịch Java có thể sử dụng lớp StringBuffer
hoặc một kỹ thuật tương tự để giảm số đối tượng trung gian String
được tạo bằng cách đánh giá biểu thức.
Đối với các loại nguyên thủy, triển khai cũng có thể tối ưu hóa việc tạo đối tượng bao bọc bằng cách chuyển đổi trực tiếp từ kiểu gốc thành chuỗi.
Ví dụ, với trình biên dịch của tôi như sau:
boolean bool = true;
System.out.println("the value of bool is : " + bool);
là chính xác tương đương với:
boolean bool = true;
System.out.println(new StringBuilder("the value of bool is : ").append(bool).toString());
Họ kết quả trong bytecode giống hệt nhau:
Code:
0: iconst_1
1: istore_1
2: getstatic #59 // Field java/lang/System.out:Ljava/io/PrintStream;
5: new #166 // class java/lang/StringBuilder
8: dup
9: ldc #168 // String the value of bool is :
11: invokespecial #170 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: iload_1
15: invokevirtual #172 // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder;
18: invokevirtual #176 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: invokevirtual #69 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
24: return
Đọc bài viết này: http://www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation/ –