Tại sao chúng tôi có equals()
và 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
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à).
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.
Đó 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
@skaffman: ví dụ tốt xin vui lòng – Roman
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
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)
.
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
Vui lòng đọc và HIỂU câu hỏi trước khi đăng câu trả lời. – missingfaktor
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.
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.
// 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
- 1. bằng() và equalsIgnoreCase() trả về false cho các chuỗi bằng nhau
- 2. hashCode Overriding với bằng ghi đè bằng equalsIgnoreCase để kiểm tra bình đẳng
- 3. giống như equalsIgnoreCase khi sử dụng indexOf
- 4. Đó là nhanh hơn, equalsIgnoreCase hoặc compareToIgnoreCase
- 5. Java equalsIgnoreCase không thành công với ß ("Sharp S" được sử dụng trong bảng chữ cái tiếng Đức)
- 6. Thay thế "#", "$", "%", "&" và "_" bằng "\ #", "\ $", "\%", "\ &" và "\ _"
- 7. Đôi bằng và tripple bằng php
- 8. java.lang.Comparable và bằng
- 9. php không bằng! = Và! ==
- 10. SignalR và cân bằng tải
- 11. INET_ATON() và INET_NTOA() bằng PHP?
- 12. execv * và viết bằng stdin
- 13. Cân bằng tải và phiên
- 14. php không bằng và không đồng đều, bằng
- 15. Mã hóa và giải mã bằng python và nodejs
- 16. Cách đăng nhập bằng Curl và SSL và cookie
- 17. SIP và Java, bắt đầu từ đâu và bằng gì?
- 18. Lưu và hiển thị trang web bằng PhantomJS và node.js
- 19. Ẩn khối (và nhớ nó) bằng JavaScript và cookie?
- 20. Lỗi bắt lỗi bằng Python và FTP
- 21. Bố cục lát bằng CSS và HTML
- 22. Tìm và thay thế bằng JavaScript
- 23. Truy cập SkyDrive bằng PHP và OAuth
- 24. Sử dụng nhóm bằng và có khoản
- 25. Nén mã CSS và JS bằng PHPStorm?
- 26. __new__ Overriding và __init__ bằng Python
- 27. Kéo và thả bằng hình ảnh
- 28. MySQL MD5 và Java MD5 không bằng
- 29. Thao tác bằng Python và văn bản
- 30. Nhận giờ và phút bằng PHP
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'. –
@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()'. –