2012-10-21 39 views
7
Object o1 = new Object(); 
Object o2 = new Object(); 
//o1=o2; 
System.out.println(o1.equals(o2)); 

Nó trả về false. Nó có thể trả lại true, nếu nhận xét bị xóa.Sử dụng phương thức equals() với String và Object trong Java


Tại sao điều tương tự không áp dụng cho lớp học String?

String s1=new String(); 
String s2=new String(); 
System.out.println(s1.equals(s2)); 

Nó trả về true. Tại sao? (vì String sử dụng thực tập sinh hoặc một cái gì đó khác có liên quan?)

Trả lời

17

equals() for String so sánh nội dung chứ không phải chính đối tượng.

bình đẳng public boolean (Object anObject)

So sánh chuỗi này đến đối tượng cụ thể. Kết quả là true nếu và chỉ khi đối số không phải là null và là một đối tượng String đại diện cho cùng một chuỗi ký tự như đối tượng này.

/* String.equals() */ 
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; 
} 

(Liên kết với các nguồn String.equals())

so với các equals for Object:

Các bằng phương pháp cho lớp Object thực hiện các quan hệ tương đương có thể sáng suốt nhất trên các đối tượng; tức là, đối với bất kỳ giá trị tham chiếu không null nào xy, phương thức này trả về true nếu và chỉ khi xy tham chiếu đến cùng một đối tượng (x == y có giá trị true).

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

(Liên kết với các nguồn Object.equals())

Ngoài ra, đừng quên hợp đồng của equals() chức năng:

Các bằng phương pháp thực hiện một quan hệ tương đương trên không tham chiếu đối tượng null:

  • Đó là reflexive: đối với bất kỳ giá trị tham chiếu không null nào x, x.equals(x) phải trả về true.
  • Đó là đối xứng: đối với bất kỳ giá trị tham chiếu không null xy, x.equals(y) nên trở về đúng nếu và chỉ nếu y.equals(x) trả về true.
  • Đó là bắc cầu: đối với bất kỳ giá trị tham chiếu không null x, y, và z, nếu x.equals(y) lợi nhuận truey.equals(z) lợi nhuận true, sau đó x.equals(z) nên trở true.
  • Đó là phù: đối với bất kỳ giá trị tham chiếu không null xy, nhiều lời gọi của x.equals(y) liên tục trở true hoặc liên tục trở false, với điều kiện không có thông tin được sử dụng trong tương đương so sánh trên các đối tượng được sửa đổi.
  • Đối với bất kỳ giá trị tham chiếu không null nào x, x.equals(null) phải trả lại false.

Cũng nên đọc:

+0

Ngoài lớp 'Object', điều tương tự cũng xảy ra với lớp mà chúng ta tạo ra. Tại sao? Nó có sử dụng phương thức lớp 'Object' không? – Tiny

+0

@Tiny Nếu bạn không ghi đè 'bằng' trong lớp, nó sẽ kế thừa phương thức 'equals' của Object. – assylias

+0

@Tiny Bởi vì mọi lớp học đều xuất phát từ Object. Bạn nên ghi đè các phương thức 'equals()' và 'hashCode()' cho các lớp của riêng bạn, nếu không chúng sẽ sử dụng các phương thức của lớp 'Object'. – ppeterka

8

equals cho Object so sánh tài liệu tham khảo bộ nhớ.
Đó là lý do tại sao nó sai vì chúng khác nhau Object s
equals cho String được ghi đè để so sánh dựa trên các ký tự.
Bạn có 2 ô trống String là lý do tại sao equals trả lại true.

+0

Có 'o1 == o2' và' o1.equals (o2) 'cùng (cả hai đều là các đối tượng như được chỉ định trong câu hỏi)? Chúng dường như giống với đặc điểm kỹ thuật. – Tiny

+0

Có. 'equals' của' Object' hiện: 'return this == o2' – Cratylus

2

Số equals được triển khai trong lớp Object chỉ so sánh các tham chiếu. Đây là mã nguồn:

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

Là' o1 == o2' và 'o1.equals (o2)' cùng (cả hai đều là các đối tượng như được chỉ định trong câu hỏi)? Chúng dường như giống với đặc điểm kỹ thuật. – Tiny

+0

@Tiny Chỉ trong trường hợp đầu tiên của bạn, khi bạn tạo hai trường hợp của lớp Object. Trong trường hợp thứ hai của bạn, bạn tạo các thể hiện của lớp String, nó ghi đè phương thức equals và sau đó so sánh cả hai đối tượng để xem chúng có cùng văn bản bên trong hay không. –

+0

Cảm ơn bạn. Loại bỏ nghi ngờ của tôi. – Tiny

2

phương thức bằng cần được ghi đè bên trong lớp nếu bạn muốn nó hoạt động theo cách khác. Theo mặc định, nó sẽ kiểm tra nếu hai tham chiếu tham chiếu đến cùng một đối tượng.

+0

Là 'o1 == o2' và' o1.equals (o2) 'cùng (cả hai đều là các đối tượng như được chỉ định trong câu hỏi)? Chúng dường như giống với đặc điểm kỹ thuật. – Tiny

4

== so sánh địa chỉ của các đối tượng/dây/bất cứ điều gì

.equals() thiết kế để sử dụng trạng thái nội bộ của đối tượng để so sánh.

Vì vậy:

new Object() == new Object() => false - hai đối tượng riêng biệt tại các địa chỉ khác nhau trong bộ nhớ.

new String("a") == new String("a") => false - cùng một tình huống - hai địa chỉ riêng biệt cho các đối tượng chuỗi.

new String("a").equals(new String("a")) => true - địa chỉ khác nhau, nhưng Java sẽ lấy một trạng thái đối tượng ('a') và so sánh với trạng thái đối tượng khác ('a') sẽ thấy chúng bằng nhau và sẽ báo cáo đúng.

Sử dụng phương thức equals() bạn có thể mã so sánh bất kỳ cách nào phù hợp với chương trình của bạn.

intern() là một câu chuyện khác. Nó được thiết kế để trả về cùng một đối tượng (địa chỉ) cho cùng một chuỗi char. Nó rất hữu ích để giảm số lượng bộ nhớ cần thiết khi bạn có cùng một chuỗi xây dựng nhiều lần.

new String("aaa").intern() sẽ tìm trong bộ nhớ máy nếu bao giờ ai đó tạo chuỗi "aaa" trước và sẽ trả về phiên bản đầu tiên của chuỗi ... Nếu không được tìm thấy - chuỗi hiện tại sẽ được nhập vào danh sách đầu tiên và tất cả "aaa" .intern() và mới String("aaa").intern()("a"+"aa").intern() sẽ trả về phiên bản "đầu tiên" đó.

Hãy coi chừng: "aaa".intern() không hoạt động rất nhanh và nếu bạn sẽ thực hiện tất cả các chuỗi - bạn sẽ tiết kiệm được một số bộ nhớ, nhưng sẽ mất khá nhiều công việc CPU.

+0

Có phải 'o1 == o2' và' o1.equals (o2) 'giống nhau (cả hai đều là các đối tượng được chỉ định trong câu hỏi)? Bạn có biết? – Tiny

1

equals() Phương thức của lớp Object không biết cách so sánh Chuỗi, chỉ biết cách so sánh các đối tượng. Để so sánh các chuỗi, một lớp chuỗi sẽ ghi đè phương thức equals() và so sánh các chuỗi trong đó.

Object.equals() sẽ chỉ so sánh các tham chiếu, trong đó String.equals() sẽ so sánh các giá trị.

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