Tôi có đoạn code sauString nối với Null
System.out.println("" + null);
và đầu ra là null
.
Làm thế nào để Java làm thủ thuật trong chuỗi nối?
Tôi có đoạn code sauString nối với Null
System.out.println("" + null);
và đầu ra là null
.
Làm thế nào để Java làm thủ thuật trong chuỗi nối?
Bởi vì Java chuyển đổi biểu thức "A String" + x
một cái gì đó dọc theo dòng của "A String" + String.valueOf(x)
Trong thực tế tôi nghĩ rằng nó có thể sử dụng StringBuilder
s, do đó:
"A String " + x + " and another " + y
giải quyết cho hiệu quả hơn
new StringBuilder("A String ")
.append(x)
.append(" and another ")
.append(y).toString()
Điều này sử dụng phương thức append
trên Trình tạo chuỗi (cho từng loại), trong đó andle null
đúng
Sử dụng Java StringBuilder.append(Object obj)
phía sau hậu trường.
Không khó để tưởng tượng triển khai của nó.
public StringBuilder append(Object obj)
{
if (obj == null)
{
append("null");
}
else
{
append(obj.toString());
}
return this;
}
Liên kết để triển khai: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuilder.java#170 –
Mã "" + null
được chuyển đổi bởi trình biên dịch để
new StringBuffer().append("").append(null);
và StringBuffer thay thế null với chuỗi "null". Vì vậy, kết quả là chuỗi "null".
Chỉ cần chỉnh sửa nhỏ; bây giờ StringBuilder không phải là StringBuffer. An toàn chủ đề không phải là một mối quan tâm với String nối (trong suốt cuộc đời của người xây dựng anyway). –
Tại sao một người muốn/cần phải viết '" "+ null' thay vì chỉ' "null" '? Có phải ví dụ đó chỉ dành cho bài tập học thuật không? – user46874
@ user46874: tôi nghĩ rằng nó phải là một thử nghiệm để xem cách null được in. –
IIRC, nó không thực sự nhấn lên 'String.valueOf (y)'. Có quá tải 'StringBuilder.append' cho mọi kiểu có thể, và' append (Object) 'xử lý null một cách trực tiếp. Bạn có thể thay thế "Tôi nghĩ rằng nó có lẽ" với "nó" mặc dù. –
Có - Tôi là người trượt băng cũ, tôi sợ - từ lúc trở lại trong ngày khi chuỗi nối không hiệu quả! –
Chỉ cần kiểm tra mã cho 'append (Object)', và nó thực sự ủy nhiệm cho 'String.valueOf()'. * Bên trong * phương pháp mặc dù. Vì vậy, họ đun sôi xuống các cuộc gọi tương tự. –