2013-01-21 40 views
16

Tôi có hai câu hỏi:Khi nào thì hồ bơi thay đổi?

public static void main(String[] args) { 
    String s1 = "bla"; 
    String s2 = "b" +"l" + "a"; 
    String s3 = "b".concat("l").concat("a"); 

    if(s1 == s2) 
     System.out.println("Equal"); 
    else 
     System.out.println("Not equal"); 
    if(s1 == s3) 
     System.out.println("Equal"); 
    else 
     System.out.println("Not equal"); 
} 
  • Tại sao s1s2 điểm đến cùng một đối tượng, trong khi s1s3 không? (Không sử dụng new từ khóa).

  • Nếu tôi nhận được một chuỗi từ người sử dụng và thêm vào các mã trên những dòng này:

    BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); 
    String name=in.readLine(); 
    if(name.equals("test")) 
        s1 = s1 + "xyz"; 
    

    Nếu người dùng nhập xyz chương trình sẽ in Not equal, khi người dùng nhập vào điều khác chương trình đầu ra Equal . Điều này có nghĩa là hồ bơi thay đổi thông qua việc thực hiện toàn bộ chương trình? Trình tối ưu hóa có hoạt động ở thời gian biên dịch và tiếp tục hoạt động trong runtime không?

Trả lời

15

Tại sao s1 và s2 trỏ đến cùng một đối tượng, trong khi s1 và s3 thì không? (Không sử dụng từ khóa mới).

Vì kết nối xảy ra tại thời gian biên dịch và chuỗi hoàn chỉnh do đó sẽ nằm trong nhóm không đổi giống như trong ví dụ đầu tiên. Đó là một trường hợp đặc biệt "được biết" với trình biên dịch. Nó thực sự có nghĩa là để chuỗi dài, nối theo cách này qua nhiều dòng, vẫn nhận được lợi ích của việc cải thiện hiệu suất giống như hằng số chuỗi đơn giản.

Trong ví dụ thứ hai, bạn đang thực hiện phép tính khi chạy, do đó, nó sẽ không nằm trong nhóm không đổi. Tuy nhiên, lưu ý rằng trong JLS chi tiết về những gì có thể và không thể đi trong nhóm hằng số chuỗi cố tình để lại mơ hồ, vì vậy các triển khai khác nhau có thể tối ưu hóa theo nhiều cách khác nhau.Nó chỉ định các quy tắc nhất định về những gì để đi vào đó, nhưng không dựa vào hành vi này nhất quán trong việc triển khai.

9

Tại sao s1 và s2 điểm đến cùng một đối tượng, trong khi s1 và s3 không? (Không sử dụng từ khóa mới).

Kể từ String trong Java là Immutable, vì vậy bất kỳ phương pháp của lớp chuỗi sẽ trả về một đối tượng String mới (có một số ngoại lệ mặc dù - một là substring phương pháp). Do đó phương pháp concat tạo một chuỗi mới, đi đến số Heap và không được thêm vào nhóm không đổi.

Theo trường hợp của s1s2 có liên quan, cả hai chuỗi được biết là biên dịch và do đó chúng là cùng một chuỗi ký tự.

Lưu ý rằng hoạt động nối trong chuỗi 2: -

String s2 = "b" +"l" + "a"; 

được đánh giá tại thời gian biên dịch, và kết quả được biết đến là giống như chuỗi đầu tiên, và một bài dự thi được thực hiện để hằng số hồ bơi.

3

Đôi khi (khi nó hiển nhiên đối với trình biên dịch giá trị của chuỗi sẽ là lúc chạy) trình biên dịch sử dụng nhóm chuỗi, trong trường hợp khác thì không.

Thực ra mã của bạn không nên phụ thuộc vào thực tế sử dụng hoặc không sử dụng hồ bơi.

Bạn không thể luôn chạy chính, vì vậy nếu bạn muốn xem Chuỗi của mình có được sử dụng từ hồ bơi hay không, bạn có thể dịch ngược mã với javap danh sách tương đối tự giải thích.

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