2013-05-27 23 views
8
public static void main(String[] args){ 
     one(); 
     two(); 
     three(); 
    } 

    public static void one() { 
     String s1 = "hill5"; 
     String s2 = "hill" + 5; 
     System.out.println(s1==s2); 
    } 

    public static void two() { 
     String s1 = "hill5"; 
     int i =5; 
     String s2 = "hill" + i; 
     System.out.println(s1==s2); 
    } 

    public static void three() { 
     String s1 = "hill5"; 
     String s2 = "hill" + s1.length(); 
     System.out.println(s1==s2); 
    } 

Output làJava String literals nối

true 
false 
false 

literals chuỗi sử dụng quá trình thực tập, thì tại sao two()three() được false.I có thể hiểu trong trường hợp three() nhưng two() không clear.but cần lời giải thích hợp cho cả hai trường hợp.

Ai đó có thể giải thích lý do chính đáng không?

+1

đọc câu hỏi này mà tôi đã hỏi http://stackoverflow.com/questions/16729045/behavior-of-string-literals-are-confusing – anshulkatta

+1

Để giải trí, bạn cũng có thể thử 'hai' với' final int i = 5 'thay vào đó (nó sẽ in true thay vì false, bởi vì bây giờ' i' là hằng số). – assylias

+0

"mỗi lần ai đó so sánh các chuỗi với == một nhà phát triển khóc ..." –

Trả lời

14

Trong trường hợp 2 và 3, trình biên dịch không thể tính giá trị của String, kể từ hill + i là một tuyên bố thời gian chạy, tương tự cho s1.length()

đọc ở đây mà tôi hỏi như vậy trường hợp - link

suy nghĩ như thế này String s1 and s2 đang sử dụng hằng số thời gian biên dịch, s1="hill5"s2="hill" + 5, hãy nhớ rằng chuỗi được chỉ định là chữ số không đổi, trạng thái của nó không thể sửa đổi được, vì Chuỗi là bất biến.

Vì vậy, tại thời gian biên dịch, trình biên dịch nói "oh yeah, chúng được tính là cùng một giá trị, tôi phải gán cùng một tham chiếu đến s1 và s2".

Nhưng trong trường hợp của phương pháp two()three(), biên dịch nói "tôi không biết, có thể là giá trị của tôi có thể được thay đổi bất cứ lúc nào, hoặc s1.length() thay đổi bất cứ lúc nào", một điều thời gian chạy của nó, vì vậy trình biên dịch không đặt s2 của phương pháp two()three() trong hồ bơi,

Do đó, chúng sai vì thời gian chạy, đối tượng mới được tạo ngay sau khi được thay đổi ngay !!

+0

+1 Tôi nghĩ rằng đây là câu trả lời –

+0

Nhưng chuỗi literals được tạo ra như là một phần của heap và jvm kiểm tra xem String tồn tại hay không, nếu không thì nó tạo ra chuỗi mới khác điểm đến cùng một vị trí .. trong trường hợp của hai và ba hill5 String là có trong hồ bơi –

+2

@ankitagahoi Không thực sự - chỉ có chuỗi liên tục được đặt trong hồ bơi, trừ khi bạn sử dụng phương pháp 'intern' ... – assylias