2010-11-16 36 views
9

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?

Trả lời

22

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

+0

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ù. –

+0

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ả! –

+2

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ự. –

7

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; 
} 
+0

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 –

3

"" + 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".

+2

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). –

+0

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

+0

@ user46874: tôi nghĩ rằng nó phải là một thử nghiệm để xem cách null được in. –

Các vấn đề liên quan