2013-08-14 30 views
15

Tôi đang phải đối mặt với một vấn đề với dòng này (bình luận dưới đây):Bắt đầu ra lạ khi in kết quả của một chuỗi so sánh

System.out.println("Using == ::"+s3==s4) 

mà kết quả đầu ra false.

Tuy nhiên, System.out.println(s3==s4) kết quả đầu ra true.

Bây giờ, tôi không thể hiểu tại sao tôi nhận được kết quả này:

public class string { 
    public static void main(String[] args){ 
     String s3="Shantanu"; 
     String s4=s3; 
     String s1=new String("java"); 
     String s2=new String("javaDeveloper"); 

     System.out.println("Using Equals Method::"+s1.equals(s2)); 
     System.out.println("Using Equals Method::"+s3.equals(s4)); 
     System.out.println("Using == ::"+s3==s4);//Problem is here in this line 
     System.out.println(s1+"Directly printing the s2 value which is autocasted from superclass to string subclass "); 
     System.out.println("Directly printing the s1 value which is autocasted from superclass to string subclass "+s2); 
     System.out.println(s3); 
    } 
} 
 
Output-Using Equals Method::false 
Using Equals Method::true 
Using == ::false 
java Directly printing the s2 value which is autocasted from superclass to string subclass 
Directly printing the s1 value which is autocasted from superclass to string subclass javaDeveloper 
+3

@roippi bạn là một ông chủ tóc nhọn? ? – jsedano

+4

Đầu ra của bạn không nhất quán với mã của bạn. Dòng thứ ba chỉ nên là 'false'. – arshajii

+1

Vui lòng kiểm tra xem kết quả đã đăng của bạn có đúng không. Rõ ràng là các ký tự đầu "Output-" sẽ không xuất hiện ở đó. Ngoài ra, lệnh gọi 'println' cuối cùng không được hiển thị in' s3' và đường giữa bị nghi ngờ. –

Trả lời

31

Bạn đang thiếu một bộ khung:

System.out.println("Using == ::" + (s3==s4)); 

Trong phiên bản của bạn, "Using == ::" + s3 đang được so sánh qua số == đến s4, không phải thứ bạn muốn.

Nói chung, + có cao hơn precedence hơn ==, đó là lý do "Using == ::" + s3==s4 đang được đánh giá là ("Using == ::" + s3) == s4.

+0

Vì vậy, trong sự tò mò, những gì đã được đánh giá trong mã của mình? Oh tôi nghĩ rằng tôi nhận được nó, nó so sánh toàn bộ chuỗi + s3 để s4, mà rõ ràng là sai. –

+1

'(" Sử dụng == :: "+ s3) == s4' – Tom

+5

Xoay thú vị trên các câu hỏi' .equals' bình thường. +1 –

5

Dòng là đúng:

"Using == ::"+s3 không được tương đương với s4

Bạn sẽ cần phải thay đổi mã của bạn:

"Using == ::"+(s3==s4) 

chỉnh sửa: Sản lượng của mã Cung cấp cho là:

Using Equals Method::false 
Using Equals Method::true 
false 
javaDirectly printing the s2 value which is autocasted from superclass to string subclass 
Directly printing the s1 value which is autocasted from superclass to string subclass javaDeveloper 
Shantanu 
+1

Vì vậy, chuỗi nối có ưu tiên cao hơn so với toán tử so sánh? Plus ... tại sao nó sẽ in chuỗi chữ nếu nó chỉ là so sánh nó? –

+0

Theo điều này - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html nó có. – Betlista

+3

Sau đó, nó sẽ in "false" và không "Using = :: false" –

13

Bạn đang sử dụng mã này:

System.out.println("Using == ::"+ s3==s4); 

nào đang được đánh giá là:

System.out.println(("Using == ::" + s3) == s4); 

Do đó bạn đang nhận được sai như đầu ra.

Lý do là theo các nhà điều hành được ưu tiên + cao hơn == theo Operator Precedence bảng này: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

Như câu trả lời khác nói rằng bạn cần phải sử dụng dấu ngoặc kèm theo biểu thức boolean của bạn:

System.out.println("Using == ::" + (s3==s4)); 
+1

Đây là giải thích tốt nhất của _why_ đầu ra là nó là gì, nhưng sẽ tốt hơn với giải thích về cách khắc phục nó. – Michelle

+0

@Michelle: IMO Trước tiên, tôi cần giải thích tại sao OP lại nhận được kết quả sai sau đó câu trả lời của tôi sẽ được hiểu rõ hơn. Xin vui lòng kiểm tra chỉnh sửa ngay bây giờ. – anubhava

+1

+1 Để đề cập đến ưu tiên và tham chiếu đến tài liệu. – Michelle

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