2009-10-29 39 views
61

Tôi đã chuyển giảng viên ngày hôm nay và anh ấy đã sử dụng một mã lạ cho tôi. (Ông nói nó tốt hơn để sử dụng .equals và khi tôi hỏi tại sao, ông trả lời "bởi vì nó là!")Sự khác biệt giữa ".equals" và "==" là gì?

Vì vậy, đây là một ví dụ:

if (o1.equals(o2)) 
{ 
System.out.println("Both integer objects are the same"); 
} 

Thay vì những gì tôi đang sử dụng để:

if (o1 == o2) 
{ 
    System.out.println("Both integer objects are the same"); 
} 

Sự khác biệt giữa hai yếu tố này là gì. Và tại sao cách của anh ấy (sử dụng .equals) tốt hơn?

Found this trên một tìm kiếm nhanh chóng nhưng tôi có thể không thực sự có ý nghĩa của câu trả lời rằng:

+0

điều này cung cấp câu trả lời tóm tắt tốt http://stackoverflow.com/a/2772888/1358837 – Mathee

+2

Không có giảng viên nào có nội dung đưa ra câu trả lời như vậy và bạn cũng không nên trả lời. – EJP

+0

Điều này đã được hỏi nhiều lần. http://stackoverflow.com/questions/971954/difference-between-equals-and – Kezzer

Trả lời

110

Trong Java, == luôn chỉ so sánh hai tài liệu tham khảo (đối với phi nguyên thủy, đó là) - tức là nó kiểm tra xem hai toán hạng tham chiếu đến cùng một đối tượng.

Tuy nhiên, phương pháp equals có thể bị ghi đè - vì vậy, hai đối tượng riêng biệt vẫn có thể bằng nhau.

Ví dụ:

String x = "hello"; 
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' }); 

System.out.println(x == y); // false 
System.out.println(x.equals(y)); // true 

Thêm vào đó, nó có giá trị là nhận thức được rằng bất kỳ hai bằng chuỗi hằng (chủ yếu là xâu, mà còn kết hợp các hằng số chuỗi qua nối) sẽ kết thúc đề cập đến cùng một chuỗi . Ví dụ:

String x = "hello"; 
String y = "he" + "llo"; 
System.out.println(x == y); // true! 

Đây xy được tham chiếu đến cùng một chuỗi, vì y là một thời gian biên dịch liên tục bằng "hello".

hành
+1

Điều gì về các lớp học không chung chung, nơi mà các bằng không bị ghi đè. phương thức equals sẽ giống như "==" và đơn giản là kiểm tra xem hai cá thể của lớp có tham chiếu đến cùng một đối tượng không? cảm ơn. – Numerator

+3

@Nir: Có. Trong các lớp, trừ khi bạn ghi đè Bằng, nó sẽ luôn có nghĩa là tham chiếu bình đẳng. –

+0

Từ ngữ khủng khiếp tại đây. Các '==' kiểm tra xem hai đối tượng có trỏ đến cùng một vị trí bộ nhớ hay không, tức là chúng là các con trỏ tới một đối tượng giống nhau. Phương thức 'equals()' so sánh trạng thái đối tượng, tức là cho cùng một kiểu là tất cả các bên trong chẳng hạn như các biến mẫu giống nhau. – ingyhere

19

Các == so sánh nếu các đối tượng đều giống nhau dụ. Equals() oerator so sánh nhà nước của các đối tượng (ví dụ nếu tất cả các thuộc tính đều bình đẳng). Bạn thậm chí có thể ghi đè phương thức equals() để xác định chính mình khi một đối tượng bằng với đối tượng khác.

+7

Lưu ý rằng việc thực thi mặc định của 'equals()' trong 'Object' sẽ trở lại hiệu quả' this == other'. Đó là một nguồn gây nhầm lẫn phổ biến, vì bạn sẽ không thấy sự khác biệt trừ khi bạn đang sử dụng một lớp thực sự thực hiện 'equals()' một cách có ý nghĩa. –

+1

Phải, tôi nên đề cập đến điều đó. Người hỏi có thể nhìn vào bản thân JDK, có rất nhiều lớp mà anh ta có thể lấy làm ví dụ. – Sylar

15

Nếu bạn và tôi mỗi người bước vào ngân hàng, mỗi mở một tài khoản hoàn toàn mới, và mỗi đặt cọc $ 100, sau đó ...

  1. myAccount.equals(yourAccount)true vì họ có cùng một giá trị , nhưng
  2. myAccount == yourAccountfalse vì họ không phải là cùng tài khoản.

(Giả định nghĩa thích hợp của lớp Account, tất nhiên. ;-)

+3

Đó sẽ là một thực hiện thực sự xấu thực sự bằng. – user44242

+4

Nó cũng là một lời giải thích thực sự, xấu về sự khác biệt giữa == và bằng. – jarnbjo

+1

Tôi thích so sánh này lol nó cho thấy lý do tại sao bạn không nên mã '==' cho chuỗi như người sai có thể nhận được tiền của bạn hoặc bạn có thể không nhận được tiền của bạn cả. (ai sẽ lưu trữ tiền như một chuỗi anyways LOL) nhưng đó là một ví dụ tốt để dọa các lập trình viên. – SSpoke

2

== là một nhà điều hành. bằng một phương thức được xác định trong lớp Object

== kiểm tra xem hai đối tượng có cùng địa chỉ trong bộ nhớ hay không và nó kiểm tra xem chúng có cùng phương thức value.equals hay không. đang được so sánh có giá trị bằng nhau (tùy thuộc vào cách thức ofcourse phương thức equals đã được thực hiện cho các đối tượng.bằng phương pháp không thể được áp dụng trên nguyên thủy (có nghĩa là nếu một a.equals nguyên thủy (someobject) là không được phép, tuy nhiên someobject.equals (a) được cho phép).

-2

Phương thức equals() và toán tử == thực hiện hai thao tác khác nhau. Phương thức equals() so sánh các ký tự bên trong đối tượng String. Toán tử == so sánh hai tham chiếu đối tượng để xem liệu chúng có tham chiếu đến cùng một cá thể hay không. Các chương trình sau đây cho thấy cách hai đối tượng String khác nhau có thể chứa các ký tự giống nhau, nhưng tham chiếu đến các đối tượng này sẽ không so sánh như bằng nhau:

// equals() vs == 
class EqualsNotEqualTo { 
    public static void main(String args[]) { 
      String s1 = "Hello"; 
      String s2 = new String(s1); 
      System.out.println(s1 + " equals " + s2 + " -> " + 
      s1.equals(s2)); 
      System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2)); 
    } 
} 

Biến s1 đề cập đến trường hợp chuỗi tạo ra bởi “Hello”. Đối tượng được gọi bởi s2 được tạo với s1 làm bộ khởi tạo. Do đó, nội dung của hai đối tượng String giống hệt nhau, nhưng chúng là các đối tượng riêng biệt. Điều này có nghĩa rằng s1s2 không đề cập đến các đối tượng tương tự và là, do đó, không ==, như được hiển thị ở đây bởi đầu ra của ví dụ trước:

Hello equals Hello -> true 
Hello == Hello -> false 
+1

Câu hỏi không thực sự ám chỉ đến chuỗi. Trong khi phương thức equals thường đề cập đến "bên trong" của một đối tượng, nó không có nghĩa vụ. Nhiều đối tượng .equals() phương pháp chỉ sử dụng địa chỉ bộ nhớ (tức là equavalent để ==) –

+1

Trong Java, có một số lượng nhỏ các loại nguyên thủy và * một * "tham khảo" loại. Toán tử '==' kiểm tra xem toán hạng của nó là * cùng *. Vì "giá trị" của một loại tham chiếu là * nhận dạng * của một đối tượng, toán hạng chỉ được coi là giống nhau nếu chúng tham chiếu đến cùng một đối tượng. Không có gì về bản thân đối tượng; thực sự, việc so sánh được thực hiện mà không cần nhìn vào nó. – supercat

-1

Trong Java, khi “== ”Toán tử được sử dụng để so sánh 2 đối tượng, nó sẽ kiểm tra xem các đối tượng có tham chiếu đến cùng một vị trí trong bộ nhớ hay không. EX:

String obj1 = new String("xyz"); 
String obj2 = new String("xyz"); 
if(obj1 == obj2) 
    System.out.println("obj1==obj2 is TRUE"); 
else 
    System.out.println("obj1==obj2 is FALSE"); 

Mặc dù chuỗi có các ký tự chính xác như nhau (“xyz”), Đoạn mã trên sẽ thực sự đầu ra: obj1 == obj2 là FALSE

Java String lớp thực sự ghi đè mặc định bằng() thực hiện trong lớp Object - và nó ghi đè phương thức để nó chỉ kiểm tra các giá trị của các chuỗi, chứ không phải vị trí của chúng trong bộ nhớ. Điều này có nghĩa rằng nếu bạn gọi phương thức equals() để so sánh 2 đối tượng String, thì miễn là chuỗi ký tự thực tế bằng nhau, cả hai đối tượng đều được coi là bằng nhau.

String obj1 = new String("xyz"); 
String obj2 = new String("xyz"); 
if(obj1.equals(obj2)) 
    System.out.printlln("obj1==obj2 is TRUE"); 
else 
    System.out.println("obj1==obj2 is FALSE"); 

Mã này sẽ ra như sau:

obj1 == obj2 là TRUE

+0

Nó thường sẽ kiểm tra xem các đối tượng cư trú tại cùng một vị trí trong bộ nhớ, nhưng đó là một chi tiết thực hiện. Một bộ thu gom rác đồng thời có thể đặt một cái ghi ở vị trí hiện tại của đối tượng, sao chép đối tượng vào một vị trí mới, sau đó cập nhật một tham chiếu để tham chiếu đến bản sao mới và cuối cùng cập nhật tham chiếu khác. Toán tử '==' sẽ phải trả về 'true' mọi lúc, ngay cả giữa hai cập nhật, vì cả hai tham chiếu sẽ * xác định * cùng một đối tượng, nhưng điều đó sẽ không ngụ ý rằng chúng đã xác định cùng một bộ nhớ. – supercat

-2

phép nói rằng "==" điều hành trả về true nếu cả hai cả hai toán hạng thuộc về cùng một đối tượng nhưng khi nó sẽ trả về true vì chúng tôi không thể chỉ định một đối tượng nhiều giá trị

public static void main(String [] args){ 
    String s1 = "Hello"; 
    String s1 = "Hello"; // This is not possible to assign multiple values to single object 
    if(s1 == s1){ 
     // Now this retruns true 
    } 
} 

Bây giờ khi điều này xảy ra thực tế, Nếu không xảy ra thì tại sao đây là chức năng so sánh == ....

-1
public static void main(String[] args){ 
     String s1 = new String("hello"); 
     String s2 = new String("hello"); 

     System.out.println(s1.equals(s2)); 
     //// 
     System.out.println(s1 == s2); 

    System.out.println("-----------------------------"); 

     String s3 = "hello"; 
     String s4 = "hello"; 

     System.out.println(s3.equals(s4)); 
     //// 
     System.out.println(s3 == s4); 
    } 

đây trong mã này u có thể campare cả hai '==' và' Equals

đây Equals được sử dụng để so sánh các đối tượng tham khảo và '==' được sử dụng để so sánh tình trạng đối tượng ..

+0

Bạn có chính xác trở lại phía trước. – EJP

-1

(1) == có thể áp dụng cho cả kiểu gốc và kiểu đối tượng, nhưng phương thức equals() chỉ có thể áp dụng cho kiểu đối tượng.

(2) == không thể ghi đè để so sánh nội dung, nhưng bằng phương pháp có thể được ghi đè để so sánh nội dung (ví dụ: lớp chuỗi, lớp trình bao bọc, lớp thu thập).

(3) == cung cấp lỗi loại không thể so sánh khi cố gắng áp dụng cho các loại không đồng nhất, trong đó bằng phương thức trả về sai.

0

== toán tử so sánh hai tham chiếu đối tượng để kiểm tra xem chúng có tham chiếu đến cùng một cá thể hay không. Điều này cũng sẽ trở thành sự thật về thành công ví dụ match.for

public class Example{ 
public static void main(String[] args){ 
String s1 = "Java"; 
String s2 = "Java"; 
String s3 = new string ("Java"); 
test(Sl == s2)  //true 
test(s1 == s3)  //false 
}} 

trên ví dụ == là một so sánh tham khảo ví dụ cả hai đối tượng trỏ đến vị trí nhớ cùng

Chuỗi bằng() là đánh giá để so sánh các giá trị trong các đối tượng.

public class EqualsExample1{ 
    public static void main(String args[]){ 
    String s = "Hell"; 
    String s1 =new string("Hello"); 
    String s2 =new string("Hello"); 
    s1.equals(s2); //true 
    s.equals(s1) ; //false 
    }} 

ví dụ trên So sánh nội dung của chuỗi. Nó sẽ trả về true nếu chuỗi khớp, ngược lại trả về false.

-2

Đây là một sự giải thích đơn giản về vấn đề của bạn:

== (bằng) được sử dụng để đánh giá biểu thức số học

nơi như

equals() phương pháp sử dụng để so sánh chuỗi

Therefo lại, nó tốt hơn để sử dụng == cho các phép toán số & bằng phương thức() cho các hoạt động liên quan đến chuỗi. Vì vậy, để so sánh các đối tượng, phương thức equals() sẽ là lựa chọn đúng đắn.

+1

Không có gì về Chuỗi trong câu hỏi. – EJP

+1

@EJP Tôi vừa cố giải thích ý nghĩa của phương thức == & equals(). – ersks

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