2012-02-09 42 views
5

Tôi quan sát thấy một hành vi kỳ lạ == toán tử trong java. Tôi cố gắng để in ra đặt như sauhành vi lạ của == trong Java

String str1 = "Rajesh"; 
String str2 = "Rajesh"; 
System.out.println("Using equals() str1 and str2 Equals :" 
      + str1.equals(str2)); 
System.out.println("Using == str1 and str2 Equals :" 
      + str1 == str2); 

Tuyên bố SOP đầu tiên in

dùng equals() str1 và str2 Equals: true

và SOP tới in ấn chỉ sai .

Tôi đã thử biên dịch trong cả nhật thực và Net Beans nhưng kết quả là như nhau. Tôi rất bối rối vì sao

Sử dụng == str1 và str2 Equals:

không được in

Giúp tôi ra trong này

Cảm ơn trước,

Raj

+0

Did bạn cố gắng đóng gói các điều kiện trong ngoặc có thể điều kiện đầu tiên được bổ sung vào chuỗi của bạn sau đó đánh giá với str2 – Josh

+2

' "Sử dụng == str1 và str2 Equals:"?. + str1 == str2 'sẽ là tương đương với '" Sử dụng == str1 và str2 Bằng: "+" Rajesh "==" Rajesh "'. Bởi vì '+' có ưu tiên cao hơn '==' ('2 + 2 == 4'), chúng ta sẽ có tương đương với' "Sử dụng == str1 và str2 Bằng: Rajesh" == "Rajesh" ', sẽ là 'false'. –

+1

có thể trùng lặp của [Java String.equals so với ==] (http://stackoverflow.com/questions/767372/java-string-equals-versus) –

Trả lời

11

cũng giống như ("Using == str1 and str2 Equals :" + str1) == str2 và điều này là sai, tất nhiên. Biểu thức được phân tích cú pháp từ trái sang phải và do đó ban đầu nó được ghép nối "Using == str1 and str2 Equals :"str1, sau đó áp dụng toán tử ==.

+0

Giúp câu trả lời này rất nhiều .. cảm ơn .. – Raj

2

Có thể một thứ tự hoạt động? Hãy thử:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 
+0

Không tạo ra bất kỳ sự khác biệt nào –

+0

Có, điều đó có nghĩa là – Bombe

-2

== chỉ có thể được sử dụng để so sánh kiểu dữ liệu nguyên thủy. Để so sánh các đối tượng bạn cần sử dụng phương thức equals. Sử dụng toán tử == trên các đối tượng thực sự so sánh các địa chỉ đó thay vì các giá trị.

+0

tại sao mọi người bỏ phiếu cho một câu trả lời sai? – shift66

+2

Vâng, nó so sánh các giá trị - nhưng những giá trị đó là các tham chiếu. Không thể nói rằng '==' * chỉ có thể được sử dụng để so sánh các kiểu dữ liệu nguyên thủy * khi nó cũng có thể được sử dụng để kiểm tra sự bình đẳng tham chiếu.Trong trường hợp này, khi chúng ta đang xử lý hai lần xuất hiện của cùng một chuỗi, '==' sẽ hoạt động tốt - nếu nó được sử dụng đúng cách. –

+0

Hãy nhớ rằng phần lớn các đối tượng không có ghi đè bằng và chỉ trả về kết quả của ==. Đó là một sai lầm khá phổ biến mà tôi thấy đối với mọi người chỉ cần giả định "Tôi đã sử dụng. Như vậy điều này sẽ làm việc đúng." – Affe

-1

Lý do là bạn không thể so sánh các chuỗi trong Java sử dụng ==.

Trong C++ hoặc C# (hoặc các ngôn ngữ khác hỗ trợ định nghĩa lại toán tử), bạn có thể ghi đè toán tử == để cung cấp chức năng đó. Java không hỗ trợ điều đó.

+1

Bạn có nghĩa là quá tải, không ghi đè (hoặc ghi đè). Và có, bạn * có thể * so sánh các tham chiếu chuỗi bằng cách sử dụng '==' trong Java. Nó sẽ so sánh các tham chiếu, không phải các đối tượng, nhưng điều đó sẽ làm việc tốt trong trường hợp cụ thể này, nếu nó đã được sử dụng đúng cách. –

+0

Vâng, tôi có nghĩa là quá tải. Và cảm ơn vì đã chỉ vào điều đó. Tôi chỉ không biết điều đó. – Abrixas2

2

Hãy thử xung quanh nó với() như thế này:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 
+0

Không có sự khác biệt ở tất cả –

+0

Nó hoạt động tốt và in này: 'Sử dụng == str1 và str2 Bằng: true'. Giải thích được đưa ra bởi @Ademiban –

-1

str1.equals(str2) lợi nhuận trueequals() chức năng so sánh nội dung của các biến chuỗi, nơi như == điều hành so sánh các trường hợp. Kể từ str1str2 là hai sự khác biệt của trường hợp của String lớp, nó sẽ trả false

+2

Ở đây, 'str1' và' str2' sẽ là tham chiếu giống hệt nhau cho cùng một chuỗi mặc dù, do cách ngôn ngữ xử lý hằng số chuỗi thời gian biên dịch. –

7

Xem http://bmanolov.free.fr/javaoperators.php cho một bảng của nhà khai thác được ưu tiên trong Java.

Toán tử + có mức ưu tiên cao hơn toán tử ==.

Vì vậy, trong thực tế, mã của bạn là tương đương như sau:

System.out.println(("Using == str1 and str2 Equals :" + str1) == str2); 

Lưu ý vị trí của dấu ngoặc đơn mà tôi nói thêm. Nó đánh giá như sau:

System.out.println((str_x + str1) == str2); 

Và sau đó như thế này:

System.out.println(str_y == str2); 

Và sau đó như thế này:

System.out.println(false); 

Để có được kết quả bạn muốn, bạn phải sử dụng dấu ngoặc đơn để xác định rằng bạn muốn toán tử == được giải quyết TRƯỚC KHI toán tử +:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 

Lưu ý vị trí mới của dấu ngoặc đơn.

-1

Trong Java == điều hành phù hợp với hai đối tượng tức là địa chỉ của họ trong khi .equals() phương pháp kết quả phù hợp các giá trị của cả hai đối tượng, đó là lý do tại sao bạn đang nhận được true cho equals()false cho == như cả hai đều là đối tượng khác nhau.

0

bằng phương thức trả về true nếu và chỉ khi x và y tham chiếu đến cùng một đối tượng. Thực hiện là việc thực hiện lớp đối tượng bằng phương thức equals.

public boolean equals(Object obj) { 
    return (this == obj); 
    } 

Trong lớp chuỗi phương pháp này đã ghi đè như sau.

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
     char v1[] = value; 
     char v2[] = anotherString.value; 
     int i = offset; 
     int j = anotherString.offset; 
     while (n-- != 0) { 
      if (v1[i++] != v2[j++]) 
      return false; 
     } 
     return true; 
     } 
    } 
    return false; 
    } 

Và nếu bạn sử dụng toán tử ==, hãy kiểm tra cả hai tham chiếu có cùng một đối tượng không. Tương tự như lớp Object bằng phương thức.

3

Vì + có ưu tiên cao hơn so với = và nếu bạn sử dụng khung (str1 == str2) sau đó kết quả này cho đúng bởi vì ưu tiên cao nhất là (. Vì vậy, đầu tiên nó sẽ kiểm tra khung bên trong dữ liệu.

String str1 = "Rajesh"; 
     String str2 = "Rajesh"; 
     System.out.println("Using equals() str1 and str2 Equals :" 
       + str1.equals(str2)); 
     System.out.println("Using == str1 and str2 Equals :" 
       + (str1 == str2)); 

Output:

Using equals() str1 and str2 Equals :true 
Using == str1 and str2 Equals :true