Trong Java, khi so sánh 2 đối tượng được khởi tạo từ một class có bằng nhau hay không, chúng ta cần implement 2 phương thức equals() và hashCode() cho class đó và sẽ sử dụng phương thức equals() để so sánh chúng.
Ví dụ, mình có class Student chứa thông tin tên, tuổi được định nghĩa với các phương thức equals() và hashCode() như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com.huongdankotlin; import java.util.Objects; public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Student student = (Student) o; return age == student.age && name.equals(student.name); } @Override public int hashCode() { return Objects.hash(name, age); } } |
Để so sánh các đối tượng của class Student, chúng ta cần sử dụng phương thức equals() thay vì toán tử equality, ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdankotlin; public class Application { public static void main(String[] args) { Student student1 = new Student("Khanh", 35); Student student2 = new Student("Khanh", 35); System.out.println(student1 == student2); System.out.println(student1.equals(student2)); } } |
Kết quả:
Như các bạn thấy, với toán tử equality, việc so sánh 2 đối tượng Student sẽ cho ra kết quả là false.
Thế nhưng, trong Kotlin, nếu các bạn viết đoạn code tương tự như trên:
1 2 3 4 5 6 7 8 9 |
package com.huongdankotlin fun main() { var student1 = Student("Khanh", 35) var student2 = Student("Khanh", 35) println(student1 == student2) println(student1.equals(student2)) } |
các bạn sẽ thấy kết quả như sau khi chạy đoạn code này:
Rõ ràng là có sự khác biệt ở đây giữa Java và Kotlin đúng không các bạn? Sử dụng toán tử equality để so sánh 2 đối tượng của class Student cùng tên, cùng tuổi trong Kotlin vẫn trả về kết quả là true. Đó là bởi vì, toán tử equality trong Kotlin là structural equality, chỉ cần 2 đối tượng có cùng nội dung, không quan trọng về địa chỉ của các đối tượng này trong memory, là chúng sẽ giống nhau. Vì lý do này mà nếu các bạn sử dụng phương thức equals() để so sánh 2 đối tượng trong Kotlin, IntelliJ sẽ suggest các bạn sử dụng toán tử equality để code ngắn gọn hơn.
Để so sánh tham chiếu (referential equality) trong Kotlin, các bạn cần viết code để so sánh 2 đối tượng với 3 dấu bằng như sau:
1 2 3 4 5 6 7 8 |
package com.huongdankotlin fun main() { var student1 = Student("Khanh", 35) var student2 = Student("Khanh", 35) println(student1 === student2) } |
Khi đó, kết quả khi so sánh sẽ giống Java, luôn là false:
Nếu:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdankotlin fun main() { var student1 = Student("Khanh", 35) var student2 = Student("Khanh", 35) println(student1 === student2) var student3 = student2 println(student2 === student3) } |
kết quả của dòng code cuối sẽ là true:
Chúng ta có so sánh bằng và so sánh không bằng trong Java với “==” và “!=”. Trong Kotlin thì chúng ta sử dụng “===” và “!==“, ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdankotlin fun main() { var student1 = Student("Khanh", 35) var student2 = Student("Khanh", 35) println(student1 === student2) var student3 = student2 println(student2 === student3) println(student2 !== student3) } |
Kết quả: