Bộ sưu tập trong Java là gì?
Một bộ sưu tập trong java được biểu diễn dưới dạng một thùng chứa nhóm tất cả các phần tử thành một đơn vị. Ví dụ : thư mục thư (nhóm email), danh bạ điện thoại (ánh xạ tên với số điện thoại).Khung là gì?
Khung là nền tảng hoặc bố cục cơ bản mà bạn bắt đầu làm việc bằng cách sử dụng các lớp và giao diện khác nhau được cung cấp. Ví dụ : Laravel là một trong những framework PHP nổi tiếng nhất cung cấp khung cơ bản cho ứng dụng của bạn.Khung sưu tập trong Java là gì?
Tất cả các đối tượng được nhóm thành một đối tượng duy nhất cùng với một kiến trúc đại diện và cung cấp các phương thức khác nhau để thao tác với các bộ sưu tập. Vì vậy, Collections framework trong Java cung cấp các cấu trúc dữ liệu khác nhau đã được triển khai để lưu trữ dữ liệu và phương thức, để thao tác với chúng bằng các tính năng như sắp xếp, tìm kiếm, xóa và chèn . Ví dụ : bạn muốn triển khai một hệ thống cho một số công ty ngẫu nhiên để cải thiện dịch vụ cho khách hàng của họ, dựa trên cơ sở ai đến trước được phục vụ trước. Điều này còn được gọi là triển khai FIFO (vào trước ra trước). Bây giờ chúng ta cần triển khai cấu trúc dữ liệu này và sau đó sử dụng nó để đạt được mục tiêu của mình. Khung Bộ sưu tập cung cấp cho chúng ta giao diện Hàng đợi mà chúng ta chỉ cần nhập thay vì triển khai, sau đó sử dụng nó và thế là xong. Triển khai : Bạn có thể nhập tất cả các bộ sưu tập bằng cách sử dụng dòng sau:
import java.util.*;
Nếu bạn muốn nhập một bộ sưu tập cụ thể thì hãy sử dụng tên gói chính xác, chẳng hạn như:
import java.util.LinkedList;
Lợi ích của Khung sưu tập trong Java
Nó có những lợi ích sau.- Đã thực hiện (tiết kiệm thời gian).
- Hiệu quả thực hiện (tốc độ và chất lượng).
- Giảm nỗ lực tìm hiểu và sử dụng các API mới.
Hệ thống phân cấp của Khung sưu tập là gì?
Bây giờ chúng ta hãy xem hệ thống phân cấp bộ sưu tập nhưng trước tiên, chúng ta cần biết các thành phần thiết yếu của khung này.- Giao diện
- Các lớp học (thực hiện)
- Thuật toán
Hệ thống phân cấp của khung sưu tập
Cho sự hiểu biết của bạn:- Bộ sưu tập, Bộ, Hàng đợi và Danh sách đều là giao diện. Set, Queue và List được mở rộng bởi giao diện Bộ sưu tập.
- PriorityQueue, HashSet, LinkedList và Stack đều là các lớp hoặc việc triển khai các giao diện này.
- Không bắt buộc một lớp chỉ thực hiện một giao diện. Ví dụ, LinkedList cũng triển khai giao diện Deque.
Các loại bộ sưu tập
Khung bộ sưu tập Java có rất nhiều loại bộ sưu tập trong đó để giảm bớt nỗ lực của chúng tôi. Dưới đây là danh sách một số bộ sưu tập:- Lớp danh sách mảng
- Lớp danh sách liên kết
- Giao diện danh sách
- Đặt giao diện
- Giao diện xếp hàng
- Giao diện bản đồ
- Lớp hàng đợi ưu tiên
- Lớp HashMap
- Giao diện có thể so sánh
- Lớp LinkedHashMap
- Lớp bản đồ cây
- Bảng băm
Giao diện bộ sưu tập
Ở đây chúng ta sẽ thảo luận về một số giao diện bộ sưu tập phổ biến và sau đó là một số phương thức được các lớp triển khai.Giao diện bộ sưu tập
Đây là nền tảng cơ bản cho khung Bộ sưu tập vì nó cung cấp tất cả các phương pháp cần thiết để triển khai. Bản đồ là cấu trúc dữ liệu duy nhất không triển khai nó nhưng tất cả các cấu trúc còn lại đều triển khai các phương thức của nó. Giao diện này có các phương thức để biết kích thước của bộ sưu tập và liệu một đối tượng có tồn tại trong bộ sưu tập hay không, thêm hoặc xóa đối tượng khỏi bộ sưu tập.Giao diện lặp lại
Đây là giao diện gốc cho khung Bộ sưu tập vì nó được mở rộng bởi giao diện Bộ sưu tập được tất cả các lớp triển khai. Nó trả về một trình vòng lặp cho bộ sưu tập cụ thể để lặp lại nó.Giao diện xếp hàng
Hàng đợi được sử dụng để giữ các phần tử nhưng chúng không thể được xử lý. Thực hiện các hoạt động thu thập cơ bản, nó cũng cung cấp các phương pháp chèn và trích xuất bổ sung.Đặt giao diện
Set được sử dụng để chứa các phần tử duy nhất trong đó. Nó không bao giờ chứa các phần tử trùng lặp và mô hình hóa sự trừu tượng hóa tập hợp toán học để biểu diễn các tập hợp, chẳng hạn như các tiến trình đang chạy trên máy.Giao diện danh sách
Danh sách là một bộ sưu tập có thứ tự đôi khi được gọi là một chuỗi có thể chứa các phần tử trùng lặp trong đó. Nó cung cấp quyền kiểm soát cho người dùng để cập nhật hoặc xóa một phần tử cụ thể, chèn một phần tử vào một điểm cụ thể bằng cách sử dụng giá trị chỉ số nguyên của nó. LinkedList và ArrayList là các lớp triển khai của giao diện List.Giao diện Deque
Deque là viết tắt của hàng đợi hai đầu, có nghĩa là chúng ta có thể thực hiện các thao tác ở cả hai đầu. Chúng ta có thể chèn và xóa các phần tử ở cả hai đầu. Giao diện Deque mở rộng giao diện hàng đợi. ArrayDeque và LinkedList đều triển khai giao diện Deque. Nó cung cấp các phương thức để chèn, xóa và kiểm tra thể hiện từ cả hai đầu.Giao diện bản đồ
Giao diện bản đồ cũng là một phần của khung Bộ sưu tập nhưng nó không mở rộng giao diện Bộ sưu tập. Nó được sử dụng để lưu trữ các cặp khóa-giá trị. Các triển khai chính của nó là HashMap, TreeMap và LinkesHashMap tương tự ở một số khía cạnh nhất định với HashSet, TreeSet và LinkedHashSet. Nó luôn chứa các khóa duy nhất nhưng các giá trị có thể bị trùng lặp. Nó rất hữu ích khi bạn cần thêm, xóa hoặc tìm kiếm một mục dựa trên khóa. Nó cung cấp cho chúng ta các phương thức cơ bản như put , get , delete , size , empty , v.v.Các phương thức phổ biến của các giao diện này
Bây giờ chúng ta sẽ xem xét một số phương thức phổ biến được cung cấp để triển khai các lớp khác nhau trong khung này ngoại trừ giao diện Map.phương pháp | Sự miêu tả |
---|---|
cộng boolean công khai (E e) | Được sử dụng để chèn một phần tử vào bộ sưu tập |
loại bỏ boolean công khai (Phần tử đối tượng) | Được sử dụng để xóa một phần tử khỏi bộ sưu tập |
kích thước int công khai() | Trả về số phần tử trong một bộ sưu tập |
boolean công khai chứa (Phần tử đối tượng) | Dùng để tìm kiếm một phần tử |
boolean công khai isEmpty() | Kiểm tra xem bộ sưu tập có trống không |
boolean công khai bằng (Phần tử đối tượng) | Kiểm tra sự bình đẳng |
Lớp sưu tập
Như chúng ta đã biết, framework có các giao diện khác nhau được triển khai bởi nhiều lớp bên trong nó. Bây giờ chúng ta hãy xem xét một số lớp thường được sử dụng.Danh sách liên kết
Đây là cấu trúc dữ liệu được sử dụng phổ biến nhất để triển khai danh sách liên kết đôi để lưu trữ các phần tử bên trong nó. Nó có thể lưu trữ các phần tử trùng lặp. Nó triển khai giao diện Dequeue được mở rộng bởi giao diện Queue và giao diện List. Nó không được đồng bộ hóa. Bây giờ hãy xem cách giải quyết vấn đề được thảo luận ở trên (khái niệm FIFO) bằng LinkedList. Vấn đề là phục vụ khách hàng theo cách họ đến trước, tức là vào trước ra trước .Ví dụ
import java.util.*;
public class LinkedListExample {
public static void main(String[] args) {
Queue<String> customerQueue = new LinkedList<String>();
//Adding customers to the Queue as they arrived
customerQueue.add("John");
customerQueue.add("Angelina");
customerQueue.add("Brooke");
customerQueue.add("Maxwell");
System.out.println("Customers in Queue:"+customerQueue);
//element() => returns head of the queue
//we will see our first customer and serve him
System.out.println("Head of the queue i.e first customer: "+customerQueue.element());
//remove () method =>removes first element(customer) from the queue i.e the customer is served so remove him to see next
System.out.println("Element removed from the queue: "+customerQueue.remove());
//poll () => removes and returns the head
System.out.println("Poll():Returned Head of the queue: "+customerQueue.poll());
//print the remaining customers in the Queue
System.out.println("Final Queue:"+customerQueue);
}
}
đầu ra
Khách hàng đang xếp hàng:[John, Angelina, Brooke, Maxwell]
Người đứng đầu hàng đợi, tức là khách hàng đầu tiên: John
Phần tử bị xóa khỏi hàng đợi: John
Poll():Người đứng đầu hàng đợi đã trở lại: Angelina
Hàng đợi cuối cùng: [Brooke, Maxwell]
Lập danh sách
Nó chỉ đơn giản thực hiện giao diện Danh sách. Nó duy trì thứ tự chèn và sử dụng mảng động để lưu trữ các phần tử thuộc các kiểu dữ liệu khác nhau. Các yếu tố có thể được nhân đôi. Nó cũng không được đồng bộ hóa và có thể lưu trữ các giá trị null. Bây giờ chúng ta hãy xem các phương thức khác nhau của nó... Chúng rất hữu ích khi chúng ta không biết mình cần chèn bao nhiêu bản ghi hoặc phần tử. Hãy lấy một ví dụ về một thư viện mà chúng ta không biết mình phải giữ bao nhiêu cuốn sách. Vì vậy, bất cứ khi nào chúng ta có một cuốn sách, chúng ta cần chèn nó vào ArrayList.Ví dụ
public class ArrayListExample {
public static void main(String args[]) {
// Creating the ArrayList
ArrayList<String> books = new ArrayList<String>();
// Adding a book to the list
books.add("Absalom, Absalom!");
// Adding a book in array list
books.add("A Time to Kill");
// Adding a book to the list
books.add("The House of Mirth");
// Adding a book to the list
books.add("East of Eden");
// Traversing the list through Iterator
Iterator<String> itr = books.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
đầu ra
Áp-sa-lôm, Áp-sa-lôm!
Một thời gian để giết
Ngôi nhà hạnh phúc
Phía đông vườn địa đàng
Bộ băm
Nó triển khai giao diện Set và không bao giờ chứa các giá trị trùng lặp. Nó thực hiện bảng băm để lưu trữ các giá trị. Nó cũng cho phép các giá trị null. Nó không bao giờ duy trì thứ tự chèn nhưng cung cấp hiệu suất thời gian không đổi cho các phương thức add , delete , size và contains . Nó tốt nhất cho hoạt động tìm kiếm và nó không được đồng bộ hóa.Ví dụ
import java.util.*;
class HashSetExample{
public static void main(String args[]){
//creating HashSet and adding elements to it
HashSet<Integer> hashSet=new HashSet();
hashSet.add(1);
hashSet.add(5);
hashSet.add(4);
hashSet.add(3);
hashSet.add(2);
//getting an iterator for the collection
Iterator<Integer> i=hashSet.iterator();
//iterating over the value
while(i.hasNext()) {
System.out.println(i.next());
}
}
}
đầu ra
1
2
3
4
5
Như bạn có thể thấy nó không duy trì thứ tự chèn.
mảngDeque
Nó triển khai giao diện Deque để cho phép hoạt động từ cả hai đầu. Nó không cho phép giá trị null. Nó nhanh hơn Stack và LinkedList khi được triển khai dưới dạng Stack và LinkedList. ArrayDeque không có giới hạn về kích thước khi nó phát triển và thu nhỏ theo yêu cầu. Nó không được đồng bộ hóa, có nghĩa là nó không an toàn cho luồng. Để giữ cho nó an toàn theo luồng, chúng ta phải triển khai một số logic bên ngoài.Ví dụ
import java.util.*;
public class ArrayDequeExample {
public static void main(String[] args) {
//creating Deque and adding elements
Deque<String> deque = new ArrayDeque<String>();
//adding an element
deque.add("One");
//adding an element at the start
deque.addFirst("Two");
//adding an element at the end
deque.addLast("Three");
//traversing elements of the collection
for (String str : deque) {
System.out.println(str);
}
}
}
đầu ra
Hai
Một
Ba
Bản đồ băm
Đó là việc triển khai giao diện Bản đồ được hỗ trợ bởi bảng băm. Nó lưu trữ các cặp khóa-giá trị. Nó không cho phép giá trị null. Nó không được đồng bộ hóa. Nó không bao giờ đảm bảo thứ tự chèn. Nó cung cấp hiệu suất thời gian không đổi cho các phương thức như get và put . Hiệu suất của nó phụ thuộc vào hai yếu tố - công suất ban đầu và hệ số tải . Dung lượng là số lượng nhóm trong bảng băm nên dung lượng ban đầu là số lượng nhóm được phân bổ tại thời điểm tạo. Hệ số tải là thước đo mức độ bảng băm có thể được điền trước khi tăng dung lượng. Phương pháp thử lại được sử dụng để tăng dung lượng và chủ yếu là tăng gấp đôi số lượng nhóm.Ví dụ
import java.util.*;
public class HashMapExample{
public static void main(String args[]){
//creating a HashMap
HashMap<Integer,String> map=new HashMap<Integer,String>();
//putting elements into the map
map.put(1,"England");
map.put(2,"USA");
map.put(3,"China");
//get element at index 2
System.out.println("Value at index 2 is: "+map.get(2));
System.out.println("iterating map");
//iterating the map
for(Map.Entry m : map.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
đầu ra
Giá trị tại chỉ số 2 là: Trung Quốc
bản đồ lặp
1 nước Anh
2 Hoa Kỳ
3 Trung Quốc
Thuật toán
Khung Bộ sưu tập cung cấp cho chúng ta các thuật toán khác nhau cho các hoạt động khác nhau để áp dụng cho các bộ sưu tập. Ở đây chúng ta sẽ xem xét những hoạt động chính nào được thực hiện bởi các thuật toán này. Nó chứa các thuật toán liên quan đến:- Sắp xếp
- Đang tìm kiếm
- Xáo trộn
- Thao tác dữ liệu thường xuyên
- Thành phần
- Tìm giá trị cực trị
Sắp xếp
Thuật toán sắp xếp sắp xếp lại danh sách theo mối quan hệ thứ tự. Hai hình thức quan hệ được cung cấp.- Đặt hàng tự nhiên
- Thứ tự so sánh
Đặt hàng tự nhiên
Theo thứ tự tự nhiên, danh sách được sắp xếp theo các phần tử của nó.Thứ tự so sánh
Trong hình thức sắp xếp thứ tự này, một tham số bổ sung, là tham số so sánh, được truyền cùng với danh sách. Thuật toán sắp xếp hợp nhất được tối ưu hóa một chút được sử dụng để sắp xếp nhanh và ổn định vì nó đảm bảo thời gian chạy n log(n) và không sắp xếp lại các phần tử bằng nhau. Chúng ta sẽ sử dụng ví dụ tương tự từ ArrayList để minh họa cách sắp xếp.Ví dụ
import java.util.*;
public class SortingExample{
public static void main(String args[]){
//Creating arraylist
ArrayList<String> books=new ArrayList<String>();
//Adding a book to the arraylist
books.add("A Time to Kill");
//Adding a book to the arraylist
books.add("Absalom, Absalom!");
//Adding a book to the arraylist
books.add("The House of Mirth");
//Adding a book to the arraylist
books.add("East of Eden");
//Traversing list through Iterator before sorting
Iterator itrBeforeSort=books.iterator();
while(itrBeforeSort.hasNext()){
System.out.println(itrBeforeSort.next());
}
//sorting the books
Collections.sort(books);
System.out.println("After sorting the books");
//Traversing list through Iterator after sorting
Iterator itr=books.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
đầu ra
Một thời gian để giết
Áp-sa-lôm, Áp-sa-lôm!
Ngôi nhà hạnh phúc
Phía đông vườn địa đàng
Sau khi sắp xếp sách
Một thời gian để giết
Áp-sa-lôm, Áp-sa-lôm!
Phía đông vườn địa đàng
Ngôi nhà hạnh phúc
GO TO FULL VERSION