I, So sánh == vs equals()
- Toán tử
==
dùng để so sánh memory address: hai biến có trỏ tới cùng 1 object trên memory (heap memory, string pool…) hay không. - Phương thức equals() có hai kiểu so sánh:
- Shallow comparison: mặc định
equals()
có implement của Object, nó trả về true khi và chỉ khi 2 biến x và y cùng trỏ tới 1 object (x == y return true). Điều này là bởi vì Object không có property nào để định nghĩa state. - Deep comparison: class có các property và tiến hành implement
equals()
dựa trên các property đó.
- Shallow comparison: mặc định
- Với các class như Integer, String…
equals()
đã thực hiện deep comparison tức là các class đó đã tiến hành implementequals()
dựa trên so sánh các property của chúng. - Chú ý: Nếu 1 class không implement
equals()
method,equals()
của class đó sẽ thừa hưởng từ class cha gần nhất implementequals()
method. - Ví dụ 1: source code implement
equals()
method (shallow comparison) trongObject
class
1 | public boolean equals(Object obj) { |
- Ví dụ 2: source code implement
equals()
method (deep comparison) trong 2 classInteger
vàString
1 | // Integer.java |
1 | // String.java |
II, Deep comparison
Với api object như
Integer
,String
… đã implementequals()
method.Chúng thực hiện có
deep comparison
như mình đã nói ở trên.Ví dụ 3:
1 | int a = 1000; |
- Ví dụ 4:
1 | String a = "abc"; |
III, Shallow comparison
Đối với class tự định nghĩa, nếu không implement
equals()
thì class đó sẽ lấy implement củaObject
class.Chúng thực hiện
shallow comparison
.Ví dụ 5: shallow comparison không override
equals()
method
1 | class Test { |
- Ví dụ 6: deep comparison override
equals()
method
1 | class Test { |