2011-12-20 17 views
5

Tôi phát hiện ra rằng Java supports constant folding of primitive types, nhưng còn khoảng String thì sao?Trình biên dịch Java có bao gồm String Constant Folding không?

Ví dụ

Nếu tôi tạo ra các mã nguồn sau

out.write("" 
     + "<markup>" 
     + "<nested>" 
     + "Easier to read if it is split into multiple lines" 
     + "</nested>" 
     + "</markup>" 
     + ""); 

gì đi vào mã biên dịch?

Phiên bản kết hợp? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

Hoặc phiên bản nối thời gian chạy ít hiệu quả hơn? out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

+0

Ghép chuỗi nhanh hơn khoảng 100 lần so với ghi vào thiết bị. Nó thực sự sẽ không quan trọng nhiều nếu nó không (nhưng nó không) –

+0

Tôi chỉ cần thử nghiệm nó trên máy tính xách tay của tôi và chậm hơn 50 lần của nó. –

+1

Đó thực sự là hành vi mà JLS yêu cầu./Bạn có thể thấy mã được tạo bằng 'javap -c'. –

Trả lời

14

Dưới đây là một thử nghiệm đơn giản:

public static void main(final String[] args) { 
    final String a = "1" + "2"; 
    final String b = "12";   

    System.out.println(a == b); 
} 

Output:

true 

Vì vậy, vâng, trình biên dịch sẽ gấp.

-1

Nó có hiệu quả dịch để: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

1

phiên bản kết hợp sẽ được sử dụng.
Trình biên dịch tối ưu hóa điều này tự động và đặt nó vào trong String Pool.

Bạn có thể chứng minh hành vi này dễ dàng bằng cách viết dòng này.

System.out.println("abc" == "a" + ("b" + "c")); // Prints true 

Đó này in đúng, có nghĩa là nó đều giống nhau đối tượng. Đó là vì hai điều:

  1. Trình biên dịch tối ưu hóa "a" + ("b" + "c") đến "abc".
  2. Trình biên dịch đặt tất cả các chuỗi ký tự chuỗi vào nhóm chuỗi. Hành vi này được gọi là String Interning.
+1

Phần đầu tiên của hành vi này được gọi là đánh giá biểu thức liên tục. – EJP