CodeGym /Blog Java /Ngẫu nhiên /Bộ sưu tập trong Java

Bộ sưu tập trong Java

Xuất bản trong nhóm

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.
  1. Đã thực hiện (tiết kiệm thời gian).
  2. Hiệu quả thực hiện (tốc độ và chất lượng).
  3. 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.
  1. Giao diện
  2. Các lớp học (thực hiện)
  3. Thuật toán

Hệ thống phân cấp của khung sưu tập

Bộ sưu tập trong Java - 1Cho sự hiểu biết của bạn:
  1. 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.
  2. 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.
  3. 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:
  1. Lớp danh sách mảng
  2. Lớp danh sách liên kết
  3. Giao diện danh sách
  4. Đặt giao diện
  5. Giao diện xếp hàng
  6. Giao diện bản đồ
  7. Lớp hàng đợi ưu tiên
  8. Lớp HashMap
  9. Giao diện có thể so sánh
  10. Lớp LinkedHashMap
  11. Lớp bản đồ cây
  12. 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 , sizecontains . 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ư getput . Hiệu suất của nó phụ thuộc vào hai yếu tố - công suất ban đầuhệ 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:
  1. Sắp xếp
  2. Đang tìm kiếm
  3. Xáo trộn
  4. Thao tác dữ liệu thường xuyên
  5. Thành phần
  6. Tìm giá trị cực trị
Để hiểu rõ hơn chúng ta sẽ thảo luận về thuật toán sắp xếp.

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.
  1. Đặt hàng tự nhiên
  2. 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

Phần kết luận

Chúng tôi hy vọng đến bây giờ bạn đã hiểu khung công tác bộ sưu tập java là gì, các giao diện và lớp của nó cũng như cách triển khai các lớp khác nhau của nó. Bạn luôn có thể sử dụng khung này để giảm bớt nỗ lực của mình trong Java. Hãy thoải mái thực hành và quay lại đây bất cứ khi nào bạn cần thêm trợ giúp. Chúc bạn học tập vui vẻ!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION