Sự khác biệt cơ bản giữa Set<E>
và List<E>
giao diện là gì?
Sự khác biệt cơ bản giữa Set<E>
và List<E>
giao diện là gì?
Câu trả lời:
List
là một chuỗi các yếu tố được sắp xếp trong khi đó Set
là một danh sách các yếu tố riêng biệt không có thứ tự (cảm ơn, Quinn Taylor ).
Một bộ sưu tập theo thứ tự (còn được gọi là một chuỗi). Người dùng giao diện này có quyền kiểm soát chính xác vị trí trong danh sách mỗi phần tử được chèn vào. Người dùng có thể truy cập các phần tử theo chỉ số nguyên (vị trí trong danh sách) và tìm kiếm các phần tử trong danh sách.
Một bộ sưu tập không chứa các yếu tố trùng lặp. Chính thức hơn, các tập hợp không chứa cặp phần tử e1 và e2 sao cho e1.equals (e2) và nhiều nhất là một phần tử null. Như ngụ ý của tên của nó, giao diện này mô hình trừu tượng hóa tập hợp toán học.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Danh sách các phần tử được sắp xếp theo thứ tự (duy nhất hoặc không)
Phù hợp với giao diện của Java có tênList
Có thể được truy cập theo chỉ mục
sử dụng
Danh sách các yếu tố độc đáo:
Phù hợp với giao diện của Java được đặt tênSet
có thể không được truy cập bởi chỉ số
sử dụng
Cả hai giao diện Set
và List
phù hợp với giao diện của Java có tênCollection
Về mặt khái niệm, chúng ta thường đề cập đến một nhóm không có thứ tự cho phép sao chép dưới dạng Túi và không cho phép trùng lặp là Tập hợp.
Danh sách
Bộ
List
s thường cho phép các đối tượng trùng lặp.
List
s phải được đặt hàng, và do đó có thể truy cập bằng chỉ mục.
Lớp thực hiện bao gồm: ArrayList
, LinkedList
,Vector
Set
s không cho phép các đối tượng trùng lặp. Hầu hết các triển khai là không có thứ tự, nhưng nó là thực hiện cụ thể.
Các lớp thực hiện bao gồm:
HashSet
(không có thứ tự),
LinkedHashSet
(được đặt hàng),
TreeSet
(được sắp xếp theo thứ tự tự nhiên hoặc bằng bộ so sánh được cung cấp)
Như chúng ta đang nói về các giao diện Java, tại sao không nhìn vào Javadoc?!
List
là một bộ sưu tập theo thứ tự (trình tự), thường cho phép trùng lặpSet
tập hợp là không chứa các phần tử trùng lặp, thứ tự lặp có thể được đảm bảo khi thực hiệnKHÔNG có đề cập nào về việc thiếu thứ tự liên quan đến Bộ: nó phụ thuộc vào việc thực hiện.
LinkedHashSet
bên trái nếu mã dựa vào thứ tự sau này. Tôi chỉ sử dụng Set
nếu tôi thực sự sử dụng nó như một, vì bạn không thể cho rằng việc triển khai cơ bản là một LinkedHashSet
hoặc như vậy, nó có thể là ngày hôm nay, nhưng ngày mai mã thay đổi và nó sẽ thất bại.
Đây có thể không phải là câu trả lời mà bạn đang tìm kiếm, nhưng JavaDoc của các lớp bộ sưu tập thực sự khá mô tả. Sao chép / dán:
Một bộ sưu tập theo thứ tự (còn được gọi là một chuỗi). Người dùng giao diện này có quyền kiểm soát chính xác vị trí trong danh sách mỗi phần tử được chèn vào. Người dùng có thể truy cập các phần tử theo chỉ số nguyên (vị trí trong danh sách) và tìm kiếm các phần tử trong danh sách.
Không giống như các bộ, danh sách thường cho phép các yếu tố trùng lặp. Chính thức hơn, các danh sách thường cho phép các cặp phần tử e1 và e2 sao cho e1.equals (e2) và chúng thường cho phép nhiều phần tử null nếu chúng cho phép các phần tử null. Không thể tưởng tượng rằng ai đó có thể muốn thực hiện một danh sách cấm trùng lặp, bằng cách ném ngoại lệ thời gian chạy khi người dùng cố gắng chèn chúng, nhưng chúng tôi hy vọng việc sử dụng này là hiếm.
Một tập hợp là một nhóm các đối tượng riêng biệt không có thứ tự - không cho phép các đối tượng trùng lặp. Nó thường được thực hiện bằng cách sử dụng mã băm của các đối tượng được chèn. (Việc triển khai cụ thể có thể thêm thứ tự, nhưng bản thân giao diện Set thì không.)
Một danh sách là một nhóm các đối tượng được sắp xếp có thể chứa các bản sao. Nó có thể được thực hiện với một ArrayList
, LinkedList
vv
List
không được ra lệnh
Danh sách:
Danh sách cho phép các yếu tố trùng lặp và giá trị null. Dễ dàng tìm kiếm bằng cách sử dụng chỉ mục tương ứng của các phần tử và nó cũng sẽ hiển thị các phần tử theo thứ tự chèn. Ví dụ: (danh sách liên kết)
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> l=new LinkedList<Integer>();
l.add(001);
l.add(555);
l.add(333);
l.add(888);
l.add(555);
l.add(null);
l.add(null);
Iterator<Integer> il=l.iterator();
System.out.println(l.get(0));
while(il.hasNext()){
System.out.println(il.next());
}
for(Integer str : l){
System.out.println("Value:"+str);
}
}
}
Đầu ra:
1
1
555
333
888
555
null
null
Giá trị: 1
Giá trị: 555
Giá trị: 333
Giá trị: 888
Giá trị: 555
Giá trị: null
Giá trị: null
Đặt:
Đặt không cho phép bất kỳ phần tử trùng lặp nào và nó cho phép một giá trị null duy nhất. Nó sẽ không duy trì bất kỳ thứ tự nào để hiển thị các phần tử. ChỉTreeSet
sẽ hiển thị theo thứ tự tăng dần.
Ví dụ: (Treeset)
import java.util.TreeSet;
public class SetExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<String> set = new TreeSet<String>();
try {
set.add("hello");
set.add("world");
set.add("welcome");
set.add("all");
for (String num : set) {
System.out.println( num);
}
set.add(null);
} catch (NullPointerException e) {
System.out.println(e);
System.out.println("Set doesn't allow null value and duplicate value");
}
}
}
Đầu ra:
tất cả
xin
chào
thế giới chào mừng
java.lang.NullPulumException
Set không cho phép giá trị null và giá trị trùng lặp
Danh sách Vs Set
1) Đặt không cho phép trùng lặp. Danh sách cho phép trùng lặp. Dựa trên việc triển khai Set, Nó cũng duy trì thứ tự chèn.
ví dụ : LinkedHashSet
. Nó duy trì thứ tự chèn. Vui lòng tham khảo bấm vào đây
2) chứa phương thức. Theo bản chất của Set, nó sẽ cung cấp hiệu suất tốt hơn để truy cập. Trường hợp tốt nhất của nó o (1). Nhưng Danh sách có vấn đề hiệu suất để gọi contains
.
Tất cả các List
lớp duy trì thứ tự chèn. Họ sử dụng các triển khai khác nhau dựa trên hiệu suất và các đặc điểm khác (ví dụ: ArrayList
tốc độ truy cập của một chỉ mục cụ thể,LinkedList
chỉ đơn giản là duy trì trật tự). Vì không có chìa khóa, các bản sao được cho phép.
Các Set
lớp không duy trì thứ tự chèn. Họ có thể tùy ý áp đặt một thứ tự cụ thể (như với SortedSet
), nhưng thường có một thứ tự được xác định theo thực hiện dựa trên một số hàm băm (như với HashSet
). Vì Set
s được truy cập bằng khóa, trùng lặp không được phép.
Đặt hàng ... một danh sách có một đơn đặt hàng, một bộ không.
Một số lưu ý khác biệt xứng đáng giữa Danh sách và Tập hợp trong Java được đưa ra như sau:
1) Sự khác biệt cơ bản giữa Danh sách và Tập hợp trong Java là cho phép các phần tử trùng lặp. Danh sách trong Java cho phép trùng lặp trong khi Set không cho phép bất kỳ sự trùng lặp nào. Nếu bạn chèn trùng lặp trong Set, nó sẽ thay thế giá trị cũ hơn. Mọi triển khai Set trong Java sẽ chỉ chứa các phần tử duy nhất.
2) Một sự khác biệt đáng kể khác giữa Danh sách và Bộ trong Java là thứ tự. Danh sách là Bộ sưu tập có thứ tự trong khi Bộ là Bộ sưu tập không có thứ tự. Danh sách duy trì thứ tự chèn của các phần tử, có nghĩa là bất kỳ phần tử nào được chèn trước sẽ có chỉ số thấp hơn bất kỳ phần tử nào được chèn sau. Đặt trong Java không duy trì bất kỳ trật tự nào. Mặc dù Set cung cấp một lựa chọn khác có tên là Sortedset có thể lưu trữ các phần tử theo thứ tự Sắp xếp cụ thể được xác định bởi các phương thức So sánh và So sánh của các Đối tượng được lưu trữ trong Set.
3) Việc triển khai phổ biến giao diện Danh sách trong Java bao gồm ArrayList, Vector và LinkedList. Mặc dù triển khai phổ biến của giao diện Set bao gồm Hashset, TreeSet và LinkedHashset.
Rõ ràng là nếu bạn cần duy trì thứ tự chèn hoặc đối tượng và bộ sưu tập của bạn có thể chứa các bản sao thì Danh sách là một cách để đi. Mặt khác, nếu yêu cầu của bạn là duy trì bộ sưu tập duy nhất mà không có bất kỳ sự trùng lặp nào thì Set là cách để đi.
Danh sách:
Bộ:
Set<E>
và List<E>
cả hai đều được sử dụng để lưu trữ các yếu tố của loại E
. Sự khác biệt là Set
được lưu trữ theo cách không có thứ tự và không cho phép các giá trị trùng lặp. List
được sử dụng để lưu trữ các phần tử theo cách có thứ tự và nó cho phép các giá trị trùng lặp.
Set
các phần tử không thể được truy cập bởi một vị trí chỉ mục và List
các phần tử có thể được truy cập bằng một vị trí chỉ mục.
Xin chào, rất nhiều câu trả lời đã được đưa ra..Hãy cho tôi chỉ ra một số điểm chưa được đề cập cho đến nay:
RandomAccess
giao diện mà là một giao diện đánh dấu để truy cập nhanh hơn. Không có triển khai Set nào làm điều đó.ListIterator
hỗ trợ lặp theo cả hai hướng . Set sử dụng Iterator chỉ hỗ trợ lặp 1 chiềuSự khác biệt lớn nhất là khái niệm cơ bản.
Từ giao diện Set và List . Đặt là khái niệm toán học. Đặt phương thức mở rộng bộ sưu tập. Dù sao không thêm phương thức mới. size () có nghĩa là cardinality (nhiều hơn là BitSet.cardinality, bộ đếm tuyến tính Log Nhật ký nhật ký , HyperLogLog ). add ALL () có nghĩa là hợp nhất. giữ lại All () có nghĩa là giao điểm. remove ALL () có nghĩa là sự khác biệt.
Tuy nhiên Danh sách thiếu các khái niệm này. Danh sách thêm rất nhiều phương thức để hỗ trợ khái niệm chuỗi mà giao diện Collection không cung cấp. khái niệm cốt lõi là INDEX . như add (index, phần tử), get (index), search (indexOf ()), remove (index) phần tử. Danh sách cũng cung cấp " Bộ sưu tập Xem " sublist . Đặt không có chế độ xem. không có quyền truy cập vị trí. Danh sách cũng cung cấp rất nhiều thuật toán trong lớp Bộ sưu tập . sắp xếp (Danh sách), binarySearch (Danh sách), đảo ngược (Danh sách), xáo trộn (Danh sách), điền (Danh sách). tham số phương thức là giao diện List . các yếu tố trùng lặp chỉ là kết quả của các khái niệm. không phải là sự khác biệt thiết yếu
Vì vậy, sự khác biệt cần thiết là khái niệm. Set là khái niệm toán học. Danh sách là khái niệm trình tự.
Đây là một ví dụ rõ ràng với Groovy. tôi tạo một bộ và một danh sách. sau đó tôi cố gắng lưu trữ 20 giá trị được tạo ngẫu nhiên trong mỗi danh sách. giá trị được tạo có thể nằm trong phạm vi từ 0 đến 5
s = [] as Set
l = []
max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}
println "\n"
println "Set : $s "
println "list : $l
Kết quả :
Số ngẫu nhiên: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3
Bộ : [4, 1, 0, 2, 3]
danh sách : [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]
Bạn có thể thấy rằng sự khác biệt là:
Set: Một Set không thể có các phần tử trùng lặp trong các bộ sưu tập của nó. nó cũng là một bộ sưu tập không có thứ tự Để truy cập dữ liệu từ Set, chỉ cần sử dụng Iterator và truy xuất dựa trên chỉ mục là không thể đối với nó. Nó chủ yếu được sử dụng bất cứ khi nào yêu cầu bộ sưu tập duy nhất.
Danh sách: Danh sách có thể có các thành phần trùng lặp, với thứ tự tự nhiên khi nó được chèn. Vì vậy, nó có thể được lấy dữ liệu dựa trên chỉ mục hoặc iterator. Nó được sử dụng rộng rãi để lưu trữ bộ sưu tập cần truy cập dựa trên chỉ mục.
Tên chủ đề: Danh sách VS Set
Tôi vừa trải qua chủ đề quan trọng nhất của Java có tên là Bộ sưu tập Khung. Tôi nghĩ để chia sẻ kiến thức nhỏ của tôi về Bộ sưu tập với bạn. Danh sách, bộ, bản đồ là chủ đề quan trọng nhất của nó. Vì vậy, hãy bắt đầu với Danh sách và Bộ.
Sự khác biệt giữa Danh sách và Bộ:
Danh sách là lớp tập hợp mở rộng AbstractList
lớp trong đó Set là lớp tập hợp mở rộng AbstractSet
lớp nhưng cả hai đều thực hiện giao diện Bộ sưu tập.
Giao diện danh sách cho phép các giá trị trùng lặp (phần tử) trong khi Giao diện cài đặt không cho phép các giá trị trùng lặp. Trong trường hợp các phần tử trùng lặp trong Set, nó sẽ thay thế các giá trị cũ hơn.
Giao diện danh sách cho phép các giá trị NULL trong đó giao diện Set không cho phép các giá trị Null. Trong trường hợp sử dụng các giá trị Null trong Set, nó mang lạiNullPointerException
.
Giao diện danh sách duy trì thứ tự chèn. Điều đó có nghĩa là cách chúng ta thêm các phần tử trong Danh sách giống như cách chúng ta có được nó bằng cách sử dụng iterator hoặc cho mỗi kiểu. Trong khi đó Set
việc thực hiện không nhất thiết phải duy trì trật tự chèn. (Mặc dù SortedSet
không sử dụngTreeSet
và LinkedHashSet
duy trì thứ tự chèn).
Giao diện danh sách có các phương thức riêng được xác định trong khi giao diện Set không có phương thức riêng nên Set chỉ sử dụng các phương thức giao diện Collection.
Giao diện danh sách có một lớp kế thừa được gọi là Vector
trong khi Giao diện cài đặt không có bất kỳ lớp kế thừa nào
Cuối cùng nhưng không kém phần quan trọng ... listIterator()
Phương thức chỉ có thể được sử dụng để xoay vòng các phần tử trong Lớp Danh sách trong khi chúng ta có thể sử dụng phương thức iterator () để truy cập Đặt các phần tử lớp
Bất cứ điều gì khác chúng ta có thể thêm? Làm ơn cho tôi biết.
Cảm ơn.
List
và Set
là các giao diện cũng có các triển khai "cơ sở" dưới dạng một lớp trừu tượng (mà bạn đã đề cập). Ngoài ra, # 3 hoàn toàn không chính xác , vì hầu hết các bộ cho phép giá trị null (nhưng phụ thuộc vào việc triển khai). Tôi không hiểu # 5 và # 7, và # 6 Vector
không phải là di sản, nhưng chỉ được đồng bộ hóa và không được ưa thích để sử dụng trừ khi cần đồng bộ hóa.
Bộ:
Không thể có các giá trị trùng lặp Đặt hàng phụ thuộc vào việc thực hiện. Theo mặc định, nó không được ra lệnh Không thể truy cập theo chỉ mục
Danh sách:
Có thể có các giá trị trùng lặp Được sắp xếp theo mặc định Có thể có quyền truy cập theo chỉ mục