assertEquals
sử dụng equals
phương pháp để so sánh. Có một khẳng định khác nhau assertSame
, trong đó sử dụng ==
toán tử.
Để hiểu lý do tại sao ==
không nên sử dụng với chuỗi, bạn cần hiểu những gì ==
: nó kiểm tra danh tính. Đó là, a == b
kiểm tra xem a
và b
tham chiếu đến cùng một đối tượng . Nó được tích hợp vào ngôn ngữ và hành vi của nó không thể bị thay đổi bởi các lớp khác nhau. Các equals
phương pháp, mặt khác, có thể ghi đè bởi các lớp học. Mặc dù hành vi mặc định của nó (trong Object
lớp) 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 nó để thay vào đó thực hiện kiểm tra "tương đương". Trong trường hợp String
, thay vì kiểm tra nếu kiểm tra xem các đối tượng mà chúng tham chiếu có phải là cả hai chuỗi chứa chính xác các ký tự không.a
và b
tham chiếu đến cùng một đối tượng,a.equals(b)
Thời gian tương tự: hãy tưởng tượng rằng mỗi String
đối tượng là một mảnh giấy với một cái gì đó được viết trên đó. Giả sử tôi có hai mảnh giấy có chữ "Foo" được viết trên đó và một mảnh khác có chữ "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 "đây có phải là cùng một mảnh giấy không?". Nó thậm chí không cần nhìn vào những gì được viết trên giấy. Thực tế là tôi đang đưa cho nó hai mảnh giấy (chứ không phải cùng một hai lần) có nghĩa là nó sẽ trở lại false
. equals
Tuy nhiên, nếu tôi sử dụng , equals
phương thức 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
.
Điều gây nhầm lẫn với Chuỗi là Java có khái niệm Chuỗi "nội bộ" và điều này (thực sự) đượ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ự chuỗi tương đương trong mã của mình (ngay cả khi chúng thuộc các lớp khác nhau) thì cả hai sẽ thực sự đề cập đến cùng một String
đối tượng. Điều này làm cho ==
toán tử trở lại true
thường xuyên hơn người ta có thể mong đợi.