assertEquals
sử dụng phương pháp equals
để so sánh. Có một xác nhận khác nhau, assertSame
, sử dụng toán tử ==
.
Để hiểu lý do tại sao ==
không nên được sử dụng với chuỗi bạn cần phải hiểu những gì ==
thực hiện: nó kiểm tra danh tính. Tức là, a == b
kiểm tra xem a
và b
có tham chiếu đến cùng một đối tượng hay không. Nó được xây dựng trong ngôn ngữ, và hành vi của nó không thể được thay đổi bởi các lớp khác nhau. Mặt khác, phương pháp equals
có thể bị ghi đè bởi các lớp. Mặc dù hành vi mặc định của nó (trong lớp Object
) là thực hiện kiểm tra danh tính bằng cách sử dụng toán tử ==
, nhiều lớp, bao gồm String
, ghi đè lên thay vào đó thực hiện kiểm tra "tương đương". Trong trường hợp của String
, thay vì kiểm tra xem a
và b
có đề cập đến cùng một đối tượng hay không, hãy kiểm tra xem các đối tượng mà chúng tham chiếu là cả hai chuỗi có chứa chính xác cùng một ký tự hay không.
Thời gian tương tự: hãy tưởng tượng rằng mỗi đối tượng String
là một mẩu giấy có nội dung được viết trên đó. Hãy nói rằng tôi có hai mảnh giấy với "Foo" được viết trên đó, và một cái khác với "Bar" được viết trên đó. Nếu tôi lấy hai mảnh giấy đầu tiên và sử dụng ==
để so sánh chúng, nó sẽ trả về false
vì về cơ bản nó hỏi "có phải cùng một mẩu giấy không?". Nó không cần phải nhìn vào những gì được viết trên giấy. Thực tế là tôi cho nó hai mẩu giấy (thay vì cùng một cái hai lần) có nghĩa là nó sẽ trả về false
. Nếu tôi sử dụng equals
, tuy nhiên, phương pháp equals
sẽ đọc hai mẩu giấy và thấy rằng chúng nói cùng một điều ("Foo"), và vì vậy nó sẽ trả lại true
.
Bit gây nhầm lẫn với Strings là Java có khái niệm về chuỗi "interning" và điều này được thực hiện tự động trên bất kỳ chuỗi ký tự nào trong mã của bạn. Điều này có nghĩa là nếu bạn có hai chuỗi ký tự tương đương trong mã của bạn (ngay cả khi chúng ở trong các lớp khác nhau), chúng sẽ thực sự cả hai tham chiếu đến cùng một đối tượng String
. Điều này giúp trả lại cho nhà khai thác ==
true
thường xuyên hơn mức có thể mong đợi.
Nguồn
2009-07-29 18:15:48
Nếu bạn không chắc chắn, bạn có thể đọc mã hoặc Javadoc. BTW nếu bạn muốn kiểm tra chúng là cùng một đối tượng, bạn có thể sử dụng assertSame. –
Nếu str1 và str2 là null, assertEquals() là true, nhưng assertTrue (str1.equals (str2)) ném một ngoại lệ. Ví dụ đầu tiên cũng sẽ in một thông báo lỗi hữu ích như nội dung của str1 và str2, thứ hai thì không. –