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:
Listlà một chuỗi các yếu tố được sắp xếp trong khi đó Setlà 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 Setvà Listphù 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ộ
Lists thường cho phép các đối tượng trùng lặp.
Lists 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
Sets 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?!
Listlà một bộ sưu tập theo thứ tự (trình tự), thường cho phép trùng lặpSettậ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.
LinkedHashSetbên trái nếu mã dựa vào thứ tự sau này. Tôi chỉ sử dụng Setnế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 LinkedHashSethoặ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, LinkedListvv
Listkhô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 Listlớ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ụ: ArrayListtố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 Setlớ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ì Sets đượ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.
Setcác phần tử không thể được truy cập bởi một vị trí chỉ mục và Listcá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 AbstractListlớp trong đó Set là lớp tập hợp mở rộng AbstractSetlớ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 đó Setviệc thực hiện không nhất thiết phải duy trì trật tự chèn. (Mặc dù SortedSetkhông sử dụngTreeSet và LinkedHashSetduy 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.
Listvà Setlà 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 Vectorkhô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