assertEqualssử dụng equalsphươ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 == bkiểm tra xem avà btham 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 equalsphươ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 Objectlớ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à btham 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ề falsevì 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. equalsTuy nhiên, nếu tôi sử dụng , equalsphươ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 truethường xuyên hơn người ta có thể mong đợi.