"" là một chuỗi thực tế, mặc dù là một chuỗi trống.
null, tuy nhiên, có nghĩa là biến String chỉ vào không có gì.
a==b
trả về false vì "" và null không chiếm cùng một không gian trong bộ nhớ - nói cách khác, các biến của chúng không trỏ đến cùng một đối tượng.
a.equals(b)
trả về false vì "" không bằng null, rõ ràng.
Sự khác biệt là mặc dù "" là một chuỗi thực tế, bạn vẫn có thể gọi các phương thức hoặc hàm trên nó như
a.length()
a.substring(0, 1)
và như thế.
Nếu Chuỗi bằng null, như b, Java sẽ ném a NullPointerException
nếu bạn đã thử gọi, nói:
b.length()
Nếu sự khác biệt bạn đang tự hỏi là == so với bằng, thì đây là:
== so sánh các tài liệu tham khảo, như nếu tôi đã đi
String a = new String("");
String b = new String("");
System.out.println(a==b);
Điều đó sẽ xuất sai vì tôi đã phân bổ hai đối tượng khác nhau và điểm a và b cho các đối tượng khác nhau.
Tuy nhiên, a.equals(b)
trong trường hợp này sẽ trả về true, vì equals
đối với String sẽ trả về true khi và chỉ khi String đối số không null và biểu thị cùng một chuỗi ký tự.
Tuy nhiên, được cảnh báo rằng Java có trường hợp đặc biệt cho Chuỗi.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Bạn sẽ nghĩ rằng đầu ra sẽ là false
, vì nó sẽ phân bổ hai Chuỗi khác nhau. Trên thực tế, Java sẽ thực hiện các chuỗi ký tự (các chuỗi được khởi tạo như a và b trong ví dụ của chúng tôi). Vì vậy, hãy cẩn thận, bởi vì điều đó có thể đưa ra một số tích cực sai về cách thức == hoạt động.
b.equals(a)
- nhưng không sử dụng==
để so sánh chuỗi là "nó sẽ không hoạt động" theo những cách khác. Cácnull
giá trị (đó là khác biệt so với một chuỗi rỗng""
, một String dụ hợp lệ) có thể không bao giờ có một phương pháp gọi theo nó. Đặt "đã biết không null" (thường là giá trị không đổi hoặc bằng chữ) vào bên trái của đẳng thức là "Yoda có điều kiện" hoặc một số tương tự.