Câu trả lời:
Sự khác biệt chính là Collections.emptyList()
trả về một danh sách bất biến , tức là một danh sách mà bạn không thể thêm các phần tử. (Áp dụng tương tự với phần được List.of()
giới thiệu trong Java 9.)
Trong trường hợp hiếm hoi, nơi bạn làm muốn thay đổi danh sách trở về, Collections.emptyList()
và List.of()
được như vậy, không một sự lựa chọn tốt.
Tôi muốn nói rằng việc trả lại một danh sách bất biến là hoàn toàn tốt (và thậm chí là cách ưa thích) miễn là hợp đồng (tài liệu) không nêu rõ ràng khác nhau.
Ngoài ra, emptyList()
có thể không tạo đối tượng mới với mỗi cuộc gọi.
Việc triển khai phương thức này không cần tạo một đối tượng List riêng cho mỗi cuộc gọi. Sử dụng phương pháp này có thể có chi phí tương đương với việc sử dụng trường cùng tên. (Không giống như phương pháp này, trường không cung cấp loại an toàn.)
Việc thực hiện emptyList
ngoại hình như sau:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Vì vậy, nếu phương thức của bạn (trả về một danh sách trống) được gọi rất thường xuyên, phương pháp này thậm chí có thể mang lại cho bạn hiệu năng tốt hơn một chút cả về CPU và bộ nhớ.
NullPointerException
bằng cách quay lại Collections.emptyList()
thay vì null
.
Collections.emptyList()
có thể lặp lại và trả về độ dài, vì vậy nó có thể được sử dụng cho các vòng lặp mà không có ngoại lệ được ném ra.
new ArrayList<>()
nó cũng làm cho quyết định thiết kế rõ ràng; các yếu tố sẽ không được thêm vào danh sách này.
Bắt đầu với Java 5.0, bạn có thể chỉ định loại phần tử trong vùng chứa:
Collections.<Foo>emptyList()
Tôi đồng tình với các phản hồi khác rằng trong trường hợp bạn muốn trả về một danh sách trống mà vẫn trống, bạn nên sử dụng phương pháp này.
List<Foo> list = Collections.emptyList()
Collections.emptyList
là bất biến nên có sự khác biệt giữa hai phiên bản nên bạn phải xem xét người dùng về giá trị được trả về.
Việc trả về new ArrayList<Foo>
luôn tạo ra một thể hiện mới của đối tượng để nó có thêm một chi phí rất nhỏ liên quan đến nó có thể cho bạn một lý do để sử dụng Collections.emptyList
. Tôi thích sử dụng emptyList
chỉ vì nó dễ đọc hơn.
Hãy cẩn thận mặc dù. Nếu bạn quay lại Collections.emptyList()
và sau đó cố gắng thực hiện một số thay đổi với nó như thế add()
hoặc smth như thế, bạn sẽ có một UnsupportedOperationException()
vì Collections.emptyList()
trả về một đối tượng bất biến.
Tôi sẽ đi cùng Collections.emptyList()
nếu danh sách trả về không bị sửa đổi theo bất kỳ cách nào (vì danh sách này là bất biến), nếu không tôi sẽ đi với tùy chọn 2.
Lợi ích của việc Collections.emptyList()
là cùng một thể hiện tĩnh được trả về mỗi lần và do đó không có việc tạo cá thể xảy ra cho mỗi cuộc gọi.
Sử dụng Collections.emptyList () nếu bạn muốn đảm bảo rằng danh sách trả về không bao giờ được sửa đổi. Đây là những gì được trả về khi gọi blankList ():
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
có chi phí xây dựng không. Xem chi tiết triển khai (mặc dù có lẽ không giống nhau trên tất cả các JVM) xác nhận rằng nó không. @Atul, JVM này là từ đâu?
Các câu trả lời đưa ra nhấn mạnh thực tế là emptyList()
trả về một bất biến List
nhưng không đưa ra giải pháp thay thế. Các ArrayList(int initialCapacity)
trường hợp đặc biệt của Trình xây dựng 0
để quay lại new ArrayList<>(0)
thay vì new ArrayList<>()
cũng có thể là một giải pháp khả thi:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(nguồn từ Java 1.8.0_72)
Collections.emptyList()
phù hợp hơn cho giả sử, kiểm tra lỗi và tương tự?