2011-10-13 36 views
40

Tôi đang làm việc trong tối ưu hóa mã Java. Tôi không rõ ràng về sự khác biệt giữa String.valueOf hoặc +"" dấu:Giá trị chuỗiOf và nối với chuỗi rỗng

int intVar = 1; 
String strVar = intVar + ""; 
String strVar = String.valueOf(intVar); 

sự khác biệt giữa dòng 2 và 3 là gì?

+0

Bản sao có thể có của [Chuyển đổi thành chuỗi sử dụng ("" + ) thực hành không đúng?] (Http://stackoverflow.com/questions/1572708/is-conversion-to-string-using-int-value-bad -practice) – Necreaux

Trả lời

54
public void foo(){ 
int intVar = 5; 
String strVar = intVar+"";  
} 

Cách tiếp cận này sử dụng StringBuilder để tạo chuỗi kết quả

public void foo(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: new  #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: iload_1 
    10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan 
g/StringBuilder; 
    13: ldc  #5; //String 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    21: astore_2 
    22: return 

public void bar(){ 
int intVar = 5; 
String strVar = String.valueOf(intVar); 
} 

Cách tiếp cận này gọi đơn giản là một phương pháp tĩnh của String để có được phiên bản String của int

public void bar(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: iload_1 
    3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri 
ng; 
    6: astore_2 
    7: return 

nó sẽ gọi Integer.toString()

5

Tôi thích valueOf(), bởi vì tôi nghĩ nó dễ đọc và rõ ràng hơn.

Bất kỳ thắc mắc nào về hiệu suất là tối ưu hóa vi mô sẽ không thể đo lường được. Tôi sẽ không lo lắng cho họ cho đến khi tôi có thể đo lường và thấy rằng họ đã tạo ra sự khác biệt.

3

Dòng đầu tiên là tương đương với

String strVal = String.valueOf(intVar) + ""; 

để có một số việc làm thêm (và vô nghĩa) để làm. Không chắc chắn nếu trình biên dịch tối ưu hóa các kết nối đi với các chuỗi ký tự trống. Nếu nó không (và nhìn vào câu trả lời @ Jigar của nó dường như không), điều này sẽ lần lượt trở thành

String strVal = new StringBuilder().append(String.valueOf(intVar)) 
         .append("").toString(); 

Vì vậy, bạn thực sự nên sử dụng String.valueOf trực tiếp.

18

Tự hỏi mình mục đích của mã. Là nó để:

  • CONCATENATE một chuỗi rỗng với một giá trị
  • Chuyển đổi một giá trị cho một chuỗi

Nghe có vẻ nhiều hơn nữa như sau này với tôi ... đó là lý do tôi muốn sử dụng String.valueOf. Bất cứ khi nào bạn có thể làm cho mã của bạn đọc theo cùng một cách như bạn mô tả những gì bạn muốn đạt được, đó là một điều tốt.

Lưu ý rằng điều này phù hợp với tất cả các loại và sẽ trả về "null" khi chuyển một tham chiếu null thay vì ném một NullPointerException. Nếu bạn đang sử dụng một lớp học (không phải là int như trong ví dụ này) và bạn muốn nó để ném một ngoại lệ nếu nó là rỗng (ví dụ: vì đó là lỗi), hãy gọi số toString trên tham chiếu thay thế.

+2

'String.valueOf (int x)' * gọi đơn giản là một phương thức tĩnh của String để lấy phiên bản chuỗi của int *. Khi chúng ta nói về Android, bạn nên * tránh sử dụng các phương pháp tĩnh. Bạn nghĩ gì về cách tiếp cận này trong Android? – Machado

1

Ghép chuỗi và các biến khác thực sự sử dụng String.valueOf() (và StringBuilder) bên dưới, vì vậy trình biên dịch hy vọng sẽ loại bỏ chuỗi rỗng và tạo ra cùng một bytecode trong cả hai trường hợp.

+0

nhìn vào câu trả lời @ Jigar của nó dường như không làm tối ưu hóa này – Thilo

+1

@ Thilo: có nhiều hơn một trình biên dịch Java mặc dù. –

0

Từ điểm tối ưu hóa, tôi sẽ luôn thích số String.valueOf() giữa hai người. Việc đầu tiên chỉ là một hack, cố gắng để lừa chuyển đổi của intVar thành một String vì toán tử +.

-1
String strVar1 = intVar+""; 
String strVar2 = String.valueOf(intVar); 

strVar1 tương đương với việc strVar2, nhưng sử dụng int + emptyString "" không phải là cách thanh lịch để làm điều đó.

sử dụng giá trịOf hiệu quả hơn.

7

Sử dụng String.valueOf(int) hoặc tốt hơn, Integer.toString(int) tương đối hiệu quả hơn cho máy. Tuy nhiên, trừ khi hiệu suất là rất quan trọng (trong trường hợp đó tôi sẽ không đề nghị bạn sử dụng một trong hai) Sau đó, ""+ x là sử dụng hiệu quả hơn thời gian của bạn. IMHO, điều này thường quan trọng hơn. Đôi khi ồ ạt quan trọng hơn.

Nói cách khác, ""+ sẽ lãng phí một đối tượng, nhưng Integer.toString() sẽ tạo một số đối tượng. Thời gian của bạn quan trọng hơn hoặc bạn muốn tránh tạo ra các vật thể bằng mọi giá. Bạn rất khó có thể ở vị trí mà tạo ra một số đối tượng là tốt, nhưng tạo thêm một đối tượng thì không.

+0

Cụm từ hay: "Sau đó" "+ x sử dụng thời gian của bạn hiệu quả hơn nhiều. IMHO, điều này thường quan trọng hơn". – teddy

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