(chủ đề cũ, nhưng chỉ 2 xu như không đề cập đến ổi hoặc các lib khác và một số chi tiết khác)
Nếu bạn có thể, hãy sử dụng ổi
Thật đáng để chỉ ra cách ổi, giúp đơn giản hóa rất nhiều những kẻ lừa đảo này:
Sử dụng
Đối với một danh sách bất biến
Sử dụng ImmutableList
lớp và các phương thức của nó of()
và copyOf()
nhà máy (các phần tử không thể rỗng) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Cho một danh sách có thể thay đổi
Sử dụng Lists
lớp và newArrayList()
phương thức xuất xưởng của nó :
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Cũng xin lưu ý các phương thức tương tự cho các cấu trúc dữ liệu khác trong các lớp khác, ví dụ như trong Sets
.
Điểm thu hút chính có thể là giảm sự lộn xộn do thuốc generic cho an toàn loại, vì việc sử dụng các phương pháp của nhà máy ổi cho phép các loại được suy ra hầu hết thời gian. Tuy nhiên, đối số này giữ ít nước hơn kể từ khi Java 7 đến với toán tử kim cương mới.
Nhưng đó không phải là lý do duy nhất (và Java 7 chưa có ở mọi nơi): cú pháp tốc ký cũng rất tiện dụng và các trình khởi tạo phương thức, như đã thấy ở trên, cho phép viết mã biểu cảm hơn. Bạn thực hiện trong một cuộc gọi Guava, mất 2 với Bộ sưu tập Java hiện tại.
Nếu bạn không thể ...
Đối với một danh sách bất biến
Sử dụng Arrays
lớp của JDK và asList()
phương thức xuất xưởng của nó , được gói bằng Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Lưu ý rằng loại trả về cho asList()
là List
sử dụng ArrayList
triển khai cụ thể , nhưng KHÔNG java.util.ArrayList
. Đó là một loại bên trong, mô phỏng mộtArrayList
nhưng thực sự trực tiếp tham chiếu mảng đã truyền và làm cho nó "ghi thông qua" (sửa đổi được phản ánh trong mảng).
Nó cấm sửa đổi thông qua một số List
phương thức của API bằng cách mở rộng một AbstractList
(vì vậy, việc thêm hoặc xóa các phần tử không được hỗ trợ), tuy nhiên, nó cho phép các lệnh gọi set()
để ghi đè các phần tử. Do đó, danh sách này không thực sự bất biến và asList()
cần phải có một lời kêu gọi Collections.unmodifiableList()
.
Xem bước tiếp theo nếu bạn cần một danh sách có thể thay đổi.
Đối với một danh sách có thể thay đổi
Tương tự như trên, nhưng được bao bọc bằng một thực tế java.util.ArrayList
:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
Đối với mục đích giáo dục: Cách thủ công của ol
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}