2012-02-18 32 views
23
List<String> listStr = new ArrayList<String>(); 

if(listStr.size == 0){ 

} 

soif (listStr.size == 0) {so với if (listStr.isEmpty()) {

if(listStr.isEmpty()){ 

} 

Theo quan điểm của tôi là một trong những lợi ích của việc sử dụng listStr.isEmpty() được rằng nó không kiểm tra kích thước của danh sách và sau đó so sánh nó với số không, nó chỉ kiểm tra xem danh sách có trống không. Có bất kỳ lợi thế nào khác như tôi thường thấy if(listStr.size == 0) thay vì if(listStr.isEmpty()) trong các mã codebase không? Có lý do nào được kiểm tra theo cách này mà tôi không biết?

+3

Trong 1.6, 'ArrayList.isEmpty' được triển khai dưới dạng' return return size == 0; '. – khachik

Trả lời

26

Câu trả lời cho this question có thể cung cấp cho bạn câu trả lời. Về cơ bản, trong việc triển khai một số danh sách, phương thức isEmpty() sẽ kiểm tra nếu kích thước bằng không (và do đó từ quan điểm về hiệu suất chúng thực tế tương đương). Tuy nhiên, trong các loại danh sách khác (ví dụ: danh sách được liên kết), việc đếm các mục cần nhiều thời gian hơn để kiểm tra xem nó có trống hay không.

Vì lý do này, việc sử dụng phương pháp isEmpty() luôn thuận tiện để kiểm tra xem danh sách có trống không. Lý do mà phương thức như vậy được cung cấp trong tất cả các loại danh sách cũng liên quan đến giao diện, kể từ ArrayList, VectorLinkedList triển khai cùng một giao diện List: this interface có phương thức isEmpty(); sau đó, mỗi loại danh sách cụ thể cung cấp phương thức thực hiện phương thức isEmpty().

+2

Câu trả lời hay, chỉ một bình luận: Việc triển khai kích thước của LinkedList() không đi qua danh sách, mà là theo dõi kích thước khi các phần tử mới được thêm vào hoặc bị loại bỏ. Do đó, hiệu suất của LinkedLists về kích thước() so với isEmpty() (mà chúng kế thừa từ AbstractCollection) không khác nhau chút nào. Với điều đó, tôi đồng ý rằng có thể có cấu trúc dữ liệu có kích thước chậm hơn() hơn isEmpty() nhưng thực hiện hợp lý sẽ không .. Ngoài ra, tôi tin rằng bạn cũng có thể đề cập nguyên tắc DRY ở đây như một kiểm tra nếu size() == 0 đã được thực hiện cho bạn trong hầu hết các phương thức isEmpty(). –

11

Không, không có lý do gì. isEmpty() thể hiện ý định rõ ràng hơn và cần được ưu tiên hơn. PMD thậm chí có a rule cho điều đó. Tuy nhiên, nó không quan trọng lắm.

+0

Chính xác. Ngoài ra, nhìn nó trong javadoc. Một số triển khai gọi kích thước() từ isEmpty(). – YRH

6

.size() có thể là O (1) hoặc O (N), tùy thuộc vào cấu trúc dữ liệu; .isEmpty() không bao giờ là O (N).

+1

Tôi không thấy tại sao isEmpty sẽ luôn là O (1) (nhưng tôi đồng ý rằng isEmpty() nên luôn luôn có ít nhất là nhanh như kích thước()). Nó cũng có thể phụ thuộc vào cấu trúc dữ liệu. Tôi không biết về bất kỳ bộ sưu tập tiêu chuẩn nào có kích thước là O (n). Có cái nào không? –

+1

Hãy thử tưởng tượng một. Bất kỳ cấu trúc nào với một sentinel - một chuỗi C, một mảng các con trỏ được chấm dứt bởi NULL, một danh sách các ô được kết thúc bằng 0. Tất cả những điều này có thể là một loại lai có thể lưu trữ chiều dài, nhưng điều đó không phải là miễn phí. ConcurrentLinkedQueue –