2011-07-26 38 views
17

Tôi đã tạo "Trình chọn màu" với ba hộp văn bản nơi người dùng xác định giá trị rgb.
Để kiểm tra xem giá trị nhập không chính xác (chỉ số giữa 0-255) Tôi đang sử dụng như sau:Sự khác biệt giữa String.isEmpty() và String.equals ("")

public Color getColor() { 
    if (tfRed.getText().equals("") || tfGreen.getText().equals("") || tfBlue.getText().equals("")) { 
       return new Color(0, 0, 0, 0); 
    } else { 
     if (tfRed.getText().matches("\\d+") && tfGreen.getText().matches("\\d+") && tfBlue.getText().matches("\\d+")) { 
      // ... 
     } else { 
      return new Color(0, 0, 0, 0); 
     } 
    } 
} 

Những gì tôi hỏi: nó là tốt hơn để sử dụng String.isEmpty()? Tôi không bao giờ tìm thấy một câu trả lời thỏa mãn và tôi luôn tự hỏi liệu có sự khác biệt nào không.

+1

Xem thảo luận này, [Tôi có nên sử dụng string.isEmpty() hoặc “” .equals (string)?] (Http://stackoverflow.com/questions/3321526/should-i-use-string-isempty-or -equalsstring) – bharath

Trả lời

25

Tôi nghĩ rằng isEmpty() hiệu quả hơn một chút. Tuy nhiên, trình biên dịch thông minh có thể tối ưu hóa cuộc gọi equals(""). Từ OpenJDK source:

671  public boolean isEmpty() { 
    672   return count == 0; 
    673  } 

1013  public boolean equals(Object anObject) { 
1014   if (this == anObject) { 
1015    return true; 
1016   } 
1017   if (anObject instanceof String) { 
1018    String anotherString = (String)anObject; 
1019    int n = count; 
1020    if (n == anotherString.count) { 
1021     char v1[] = value; 
1022     char v2[] = anotherString.value; 
1023     int i = offset; 
1024     int j = anotherString.offset; 
1025     while (n-- != 0) { 
1026      if (v1[i++] != v2[j++]) 
1027       return false; 
1028     } 
1029     return true; 
1030    } 
1031   } 
1032   return false; 
1033  } 

Ngoài ra answer here về việc có nên sử dụng str.isEmpty() hoặc "".equals(str) là chỗ trên:

Lợi ích chính của "".equals(s) là bạn không cần việc kiểm tra null (equals sẽ kiểm tra đối số của nó và trả lại false nếu nó không có), mà bạn dường như không quan tâm. Nếu bạn không lo lắng về s là null (hoặc nếu không kiểm tra cho nó), tôi chắc chắn sẽ sử dụng s.isEmpty(); nó cho thấy chính xác những gì bạn đang kiểm tra, bạn quan tâm có hay không s trống, không cho dù nó bằng với chuỗi rỗng

11

Có, sử dụng String.isEmpty(). Nó là sạch hơn (ngữ nghĩa) (hiệu năng cũng tốt hơn một chút, nhưng điều đó sẽ không đáng kể) Nếu thể hiện có thể là rỗng, hãy dùng commons-lang StringUtils.isEmpty(string)

4

, trước tiên trình biên dịch tạo đối tượng String (tương đương với myString.equals(new String("")).

Vì vậy, isEmpty() phải là một lựa chọn tốt hơn (mặc dù equals ("") là rất phổ biến).

+1

Chuỗi ký tự thường được tải khi lớp tải và "" gần như được bảo đảm để tồn tại. –

+0

@Peter Lawrey ý của bạn là "nạp". Singletons? – SJuan76

+2

nó không tương đương với 'chuỗi mới (" ")'. '" "' là tập trung và đã tồn tại trong nhóm chuỗi. – Bozho

6

Kể từ isEmpty() kiểm tra nếu chiều dài của String là 0 và "" chỉ là String với chiều dài 0, mỗi String mà trong đó isEmpty() trả về true cũng sẽ trả về true đến .equals(""). Vì vậy, về mặt kỹ thuật, họ cũng làm như vậy.

Có thể có sự khác biệt tối thiểu về hiệu suất, nhưng tôi sẽ không bận tâm về điều đó chút nào (tôi sẽ rất ngạc nhiên nếu nó đáng chú ý trong mã sản xuất).

Một khác biệt khác là nếu bạn viết "".equals(someString), thì đó sẽ là "null-safe". Nói cách khác: nếu someStringnull, cấu trúc này chỉ đơn giản là sẽ đánh giá là false và không ném một NullPointerException. Tuy nhiên, nếu bạn có someString.equals("") thì điều này sẽ không áp dụng.

Các quan trọng nhất khác biệt là làm thế nào nó đọc: isEmpty() làm cho ý định rất rõ ràng: bạn muốn để điều trị chuỗi rỗng khác nhau..equals("") từng hơi hơi ít hơn rõ ràng ("nếu chuỗi đó bằng với chuỗi khác, điều đó xảy ra trống").

+0

Ngoài câu trả lời ở trên 'String.equals (" ")' hơi chậm hơn một lệnh 'isEmpty()'. Chuỗi lưu trữ một biến đếm được khởi tạo trong hàm tạo, vì các chuỗi là không thay đổi. 'isEmpty()' so sánh biến đếm với 0, trong khi bằng sẽ kiểm tra loại, độ dài chuỗi, và sau đó lặp qua chuỗi để so sánh nếu kích thước phù hợp. 'isEmpty()' sẽ thực sự ít hơn rất nhiều! và đó là một điều tốt. –

4

Về lý thuyết, đúng vậy. Đối với isEmpty(), chỉ cần xem xét siêu dữ liệu nội bộ của chuỗi (ví dụ: chiều dài của chuỗi đó). Để so sánh, bạn sẽ mong đợi sự khác biệt một chút trong trường hợp xảy ra.

Trong thực tế, điều đó không quan trọng. Bạn sẽ không quan sát sự khác biệt tốc độ.

Quy tắc kết xuất: Sử dụng phương pháp được hiểu rõ nhất/dễ đọc nhất bởi người lập trình. Nếu nó là một thử nghiệm cho chuỗi rỗng, tôi nghĩ rằng isEmpty() phù hợp với mục đích đó tốt nhất.

4

isEmpty() là nhanh hơn bởi vì nó chỉ so sánh lĩnh vực length số nguyên trong String lớp để 0 trong khi so với một chuỗi rỗng lúc tốt nhất sẽ so sánh tài liệu tham khảo (tốc độ tương tự) và lúc tồi tệ nhất - chạy một vòng lặp với 0 lần lặp lại.

Nhưng sự khác biệt lớn nhất là dễ đọc - isEmpty() ngắn hơn và dễ nắm bắt hơn. BTW Tôi muốn có một tốc ký isBlank() cho .trim().isEmpty() ...

5

Thông thường, tôi thích sử dụng bình đẳng nhưng ngược lại, ví dụ:

"".equals(someString); 

Null-an toàn :)

Nhưng yeah, isEmpty() là một hoạt động đơn giản nhưng không quá nhiều mà tôi thấy nó làm cho bất kỳ đóng góp hiệu suất đáng kể (trừ khi bạn đang viết các công cụ nhúng thời gian thực).

2

isEmpty chỉ được giới thiệu trong 1.6. Kiểm tra Từ thẻ trong javadoc.

Do đó, nếu bạn đang biên soạn cho 1,5 và thấp hơn equals("") là lựa chọn duy nhất của bạn.

Tuy nhiên, nếu tính tương thích của phiên bản không phải là mối quan tâm của bạn, tôi sẽ sử dụng isEmpty. Như Bozho chỉ ra nó là ngữ nghĩa sạch hơn (và nhanh hơn một chút).

3

Đó là một phần vấn đề lịch sử và sử dụng cũ. isEmpty() chỉ được thêm vào trong JDK 6:

/** 
* Returns <tt>true</tt> if, and only if, {@link #length()} is <tt>0</tt>. 
* 
* @return <tt>true</tt> if {@link #length()} is <tt>0</tt>, otherwise 
* <tt>false</tt> 
* 
* @since 1.6 
*/ 
public boolean isEmpty() { 

Trước đó, tất cả mọi người so với "" để xem nếu một chuỗi trống rỗng hay không. Thói quen cũ chết cứng, vì vậy vô số người tiếp tục sử dụng so sánh "".

Tất nhiên, như đã đề cập bởi người khác, nếu bạn sử dụng "".equals(someString) thì nó sẽ tự động không an toàn. Nhiều người kết hợp ý tưởng của isEmpty với độ an toàn không bằng cách thực hiện một số static isEmpty method.

+0

* "Trước đó, mọi người so sánh với" "để xem một Chuỗi có trống hay không." * - không phải tất cả mọi người. Một số người đã sử dụng 'length() == 0' –

+0

Bạn nói đúng;) –

4

Một lý do nữa khi sử dụng myString.equals("") hoặc myString.length() == 0 là phương pháp String#isEmpty() đã được giới thiệu trong Java 1.6.

Vì vậy đối số không sử dụng String#isEmpty() có thể là nguyên nhân tương thích với các phiên bản Java trước.

0

Tôi đã luôn luôn sử dụng .isEmpty() ... đến ngày hôm nay, khi tôi phát hiện ra rằng nó không tồn tại trong Java 5.

Vì vậy:

  • Trong Java 6 và mới hơn, chúng tôi có sự lựa chọn, và tôi khuyên bạn nên sử dụng .isEmpty(), viết và đọc dễ dàng hơn.
  • Trong Java 5 trở lên, chúng tôi phải sử dụng .equals("").
0

String.equals ("") hơi chậm hơn một cuộc gọi isEmpty(). Chuỗi lưu trữ một biến đếm được khởi tạo trong hàm tạo, vì các chuỗi là không thay đổi.

isEmpty() so sánh biến đếm với 0, trong khi bằng sẽ kiểm tra loại, độ dài chuỗi và sau đó lặp qua chuỗi để so sánh nếu kích thước phù hợp.

Vì vậy, để trả lời câu hỏi của bạn, isEmpty() thực sự sẽ làm được ít hơn rất nhiều! và đó là một điều tốt.

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