2010-03-20 20 views
13

Tại sao chúng tôi có equals()equalsIgnoreCase() làm hai phương pháp khác nhau, khi equals() có thể bị quá tải với đối số ignoreCase đặc biệt để cung cấp chức năng equalsIgnoreCase()?bằng (...) và equalsIgnoreCase (...)

Trả lời

16

Phương thức equals() được kế thừa từ Object, vì vậy chữ ký của nó không được thay đổi. equals() thường có thể được sử dụng mà không thực sự biết lớp bê tông của đối tượng, ví dụ: khi lặp qua một bộ sưu tập các đối tượng (đặc biệt là trước các thế hệ Java 5). Vì vậy, sau đó bạn thậm chí sẽ không nhìn thấy các khác equals() mà không downcasting đối tượng của bạn để String đầu tiên.

Đây là một lựa chọn thiết kế từ những người tạo Java để làm thành ngữ sử dụng equals() có thể sử dụng chính xác theo cùng một cách cho tất cả các đối tượng.

Hơn nữa, IMO

if (string1.equalsIgnoreCase(string2)) ... 

là dễ đọc hơn, do đó ít dễ bị lỗi hơn

if (string1.equals(string2, true)) ... 

Tất nhiên, trong các lớp học riêng của bạn, bạn có thể tự do thêm một equals() với chữ ký khác nhau (trên trên cùng của tiêu chuẩn equals(), tức là).

+0

nhưng tôi thấy các triển khai khác như 'compareTo()' và 'compareToIgnoreCase()' cũng không có kết nối với lớp 'Object'. –

+1

@Vaibhav Một thiết kế API tốt phù hợp với việc đặt tên (trong số những thứ khác). Nếu các phương thức thực hiện những việc tương tự được đặt tên theo một mẫu tương tự, thì API dễ học và dễ sử dụng hơn, điều này cũng làm giảm cơ hội lỗi. Hơn nữa, đối số khả năng đọc của tôi ở trên áp dụng cho 'compareToIgnoreCase()' cũng như 'equalsIgnoreCase()'. –

1

Vì phương thức equals() được kế thừa từ Đối tượng.

Nếu họ đã làm điều đó như bạn đề nghị sau đó chúng ta sẽ có một cái gì đó như thế này:

public final class String { 

    public boolean equals() { ... } 

    public boolean equals (boolean ignoreCase) { ... } 

} 

Và không có đọc tài liệu nó sẽ là không thể hiểu được những gì phương pháp equals() (mà không có tham số) làm.

+1

Đó là một mô hình hoàn hảo API chung. Biểu mẫu đầu tiên sử dụng giá trị mặc định cho đối số. Và nếu nó không thể nói những gì mà mặc định là không đọc tài liệu, sau đó bạn đọc tài liệu. – skaffman

+0

@skaffman: ví dụ tốt xin vui lòng – Roman

+0

OK, 'java.lang.String' có một số hàm tạo, nhiều trong số đó là các phiên bản đơn giản của các hàm tạo khác và cung cấp các giá trị mặc định khi chúng gọi chúng. Hành vi không rõ ràng nếu không nhìn vào javadoc. – skaffman

2

Hoàn toàn có thể thực hiện những gì bạn đang đề xuất nhưng các nhà thiết kế ngôn ngữ đã chọn cách khác và do đó chúng tôi có equalsIgnoreCase(otherString) thay vì nói equals(otherString, StringConstants.IGNORE_CASE) hoặc equals(otherString, true).

3

equalIgnoreCase() được sử dụng để bỏ qua trường hợp nhạy cảm với số String của chúng tôi. Nhưng equals() là chỉ trả true, trong khi được giống trường hợp của string

ex,

String value="java"; 
if(value.equals("JAva") 
{ 
    System.out.println("Return True"); 
} 
else 
{ 
    System.out.println("Return False"); 
} 

Ans: Trả False

nhưng là một trong những khác,

if(value.equalIgnoreCase("JAva") 
{ 
    System.out.println("Return True"); 
} 
else 
{ 
    System.out.println("Return False"); 
} 

Ans: Trả lại True

+4

Vui lòng đọc và HIỂU câu hỏi trước khi đăng câu trả lời. – missingfaktor

0

Tôi nghĩ họ chỉ chọn một trong những lựa chọn thay thế. .NET đã chọn cái còn lại. StringComparison.InvariantCultureIgnoreCase vv

Chắc chắn những gì bạn đang đề xuất và [thậm chí tốt hơn những gì]. NET thực hiện sẽ linh hoạt hơn đối với các nền văn hóa khác nhau. Trong thực tế tôi thậm chí không biết văn hóa họ sử dụng trong trường hợp bỏ qua này . Tôi đoán văn hóa hiện tại.

1

Kiểm tra chính khi overridng một phương pháp với các tham số bổ sung là tôi sẽ mong đợi bất kỳ phương pháp ghi đè để làm chính xác cùng một điều như phương pháp nó ghi đè. Bằng(), được bắt nguồn từ Object có một hợp đồng nó phải tuân theo. Hai đối tượng bằng nhau() phải có mã băm giống hệt nhau. Tôi không nghĩ rằng hai đối tượng không phân biệt chữ hoa chữ thường nên có cùng mã băm, vì vậy tôi tin rằng trọng số bằng nhau ở đây là điều sai trái để làm.

1
// Demonstrate equals() and equalsIgnoreCase(). 
    class equalsDemo { 
    public static void main(String args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 
    String s3 = "Good-bye"; 
    String s4 = "HELLO"; 
    System.out.println(s1 + " equals " + s2 + " -> " + 
    s1.equals(s2)); 
    System.out.println(s1 + " equals " + s3 + " -> " + 
    s1.equals(s3)); 
    System.out.println(s1 + " equals " + s4 + " -> " + 
    s1.equals(s4)); 
    System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " + 
    s1.equalsIgnoreCase(s4)); 
    } 
} 

Kết quả của chương trình được hiển thị ở đây:

Hello equals Hello -> true 
Hello equals Good-bye -> false 
Hello equals HELLO -> false 
Hello equalsIgnoreCase HELLO -> true 
Các vấn đề liên quan