Tôi nghĩ vấn đề này trong Java vẫn còn nhiều bạn chưa phân biệt rõ sự khác nhau giữa toán tử “==” và phương thức equal() trong Java, đặc biệt là khi so sánh chuỗi String trong Java. Hôm nay mình viết bài này để mọi người tham khảo và góp ý.
VD1: Giả sử tôi có đoạn code như sau:
String a = new String(“abc”);
String b = new String(“abc”);
System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?false
System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true
Vậy tại sao kết quả lại khác nhau?
Trong JAVA, có 2 kiểu biến: biến tham trị và tham chiếu.
Biến kiểu tham trị bao gồm các kiểu nguyên thủy của JAVA như: int, long, double…
Biến kiểu tham chiếu bao gồm: String, array, kiểu đối tượng…
Khi sử dụng biến kiểu tham trị, JAVA chỉ cho phép bạn sử dụng toán tử so sánh “==”.
Khi sử dụng biến kiểu tham chiếu, JAVA cho phép sử dụng cả toán tử “==” và equals(). Tuy nhiên, khi sử dụng toán tử “==”, bộ xử lý của JAVA sẽ so sánh xem 2 biến tham chiếu này có trỏ đến cùng một đối tượng hay không, còn nếu bạn sử dụng phương thức equals(), bộ xử lý JAVA sẽ so sánh giá trị của 2 biến tham chiếu đó. Điều này lý giải tại sao ở ví dụ trên, khi sử dụng phép toán: a.equals(b) => kết quả trả về bằng true, trong khi a==b => kết quả trả về lại bằng false.
Để hiểu hơn, tôi xét thêm một ví dụ nữa:
String a = new String(“abc”);
String b = a;
System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?true
System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true
Nếu bạn có thắc mắc gì hãy để lại comment. Hy vọng các bạn có được một kiến thức bổ ích.
7 responses to “Phân biệt toán tử == và phương thức equal() trong Java.”
minhnhat
February 6th, 2010 at 10:56
cool!!
cucquynhob
February 27th, 2010 at 15:56
hì,thanks bạn nhiều! mình đã hiểu rõ vấn đề này rùi!
Phongbk
April 19th, 2010 at 11:21
class MyValue {
int i;
}
public class EqualsMethod2 {
public static void main(String[] args) {
MyValue v1 = new MyValue();
MyValue v2 = new MyValue();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
System.out.println(v1==v2);
}
}
Tại sao đoạn code trên thì equals và == đều cho false???
itpro
March 16th, 2011 at 15:19
tai sao no cho false u!thuc ra khi ma ban khai bao :int a=3;int b=3;
thi luc do ban dung equals va == no deu cho gia tri true ca!boi vi chuong trinh dich java
nhan ra duoc cai kieu int ban kia!con o day 2 gia tri v1 va v2 cua ban la do ban dinh nghia chu khog phai do java dinh nghia!vi the chuong trinh dich khong the hieu duoc!
mobilesprogramming
April 20th, 2010 at 22:09
Chào bạn!
Đây là link trả lời câu hỏi của bạn: http://www.artima.com/lejava/articles/equality.html
tùng
March 2nd, 2011 at 08:30
cho tôi hỏi cách kết hợp giữa panel, frame, và các chế độ layout làm sao một cách có hiệu quả , bạn cho vd cụ thể nhá cho dễ hiểu ,
càng nhiều càng tốt., cám ơn
Võ Quang Hòa
May 4th, 2011 at 17:21
Mình nghĩ cái này còn nhiều vấn đề lắm. Chẳng hạn như mấy câu lệnh in ra màn hình sau, đoán xem nó in ra true hay false trước khi thử, hehe
System.out.println(“Lap trinh Java”==”Lap trinh Java”);
System.out.println(“Lap trinh Java”.substring(1,3)==”Lap trinh Java”.substring(1,3));
System.out.println(new Integer(123)==new Integer(123));
System.out.println(Integer.valueOf(“123″)==Integer.valueOf(“123″));
System.out.println(Integer.valueOf(“123123″)==Integer.valueOf(“123123″));