1. Set trong Java là gì?

Set trong Java là một Interface trong bộ collection của Java, nó được sử dụng để lưu trữ các phần tử hay các đối tượng giống như List Interface trong Java. Tuy nhiên, Set có một vài tính chất ngược lại với kiểu List trong Java. Set chỉ cho phép lưu trữ các phần tử có thứ tự và không được lặp lại  – điều này nghĩa là các phần tử bên trong Set là các giá trị duy nhất giống như các hằng số.

Set Interface được sử dụng lại Collection Interface và các phương thức của chúng để ngăn chặn việc chèn vào các phần tử giống nhau. Lớp SortedSet() và lớp NavigableSet() là hai Intertface kế thừa của nó và chúng ta hoàn toàn có thể sử dụng để triển khai một Set khi được khởi tạo. Ngoài ra ta cũng có thể sử dụng lớp LinkedHashSet() hoặc lớp HashSet() để có thể triển khai một Set mới được khởi tạo.

Chúng ta hoàn toàn có thể tìm thấy Set trong thư viện java.util và để sử dụng được kiểu Set trong Java ta chỉ cần nhập thư viện: import java.util.*;

2. Khai báo Set trong Java

Như đã đề cập ở phần trên, để khởi tạo hay khai báo được một kiểu Set trong Java ta cần gọi đến một lớp có tên là Set. Khi khởi tạo một đối tượng Set mới, ta có thể khởi tạo Set và triển khai Interface Set theo các lớp là LinkedHashSet() hoặc lớp HashSet() – trong tùy trường hợp mà ta sẽ sử dụng các lớp triển khai khác nhau trong khi khởi tạo Set.

Dưới đây là các ví dụ khởi tạo một Set mới sử dụng lớp LinkedHashSet() và lớp HashSet() để triển khai Set đó:

//Khoi tao Set voi kieu String su dung LinkedHashSet()
Set<String> data = new LinkedHashSet<String>();  

//Khoi tao Set voi kieu String su dung HashSet()
Set<String> data = new HashSet<String>();

Trong các ví dụ tiếp theo, đôi lúc chúng ta sẽ sử dụng lớp LinkedHashSet() hoặc có khi là lớp HashSet() để triển khai một Set mới khi được khởi tạo. Như trong ví dụ dưới đây, chúng ta sẽ cùng nhau khởi tạo một Set mới và sử dụng lớp LinkedHashSet() để triển khai nó. Sau đó, ta sẽ cùng nhau kiểm tra xem Set vừa khởi tạo có rỗng không bằng phương thức Set.isEmpty() và hiển thị ra các phần tử có trong Set vừa khởi tạo:

import java.util.*;   
public class Main{   
    public static void main(String[] args){   
        //Khoi tao set voi kieu string su dung LinkedHashSet()
        Set<String> set = new LinkedHashSet<String>();   
        //Kiem tra set vua tao co rong hay khong?
        boolean result = set.isEmpty();
        System.out.println("Set vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set);    
    }   
}

Kết quả:

Set vua tao co rong hay khong? 
true
Phan tu co trong Set la: 
[]

Từ kết quả ở ví dụ trên, ta có thể rút ra một nhận xét rằng một Set mới khi khởi tạo sẽ là một Set rỗng. Các phần tử trong một Set sẽ được lưu trữ bên trong cặp dấu ngoặc vuông [ ] – điều này cũng khá giống với kiểu List trong Java.

3. Thao tác với Set trong Java

3.1 Thao tác với Set như một tập hợp

Khi làm việc với kiểu Set trong Java, chúng ta hoàn toàn có thể sử dụng các phép toán của một tập hợp như: phép giao hoán, phép hợp và phép trừ. Vì các tính chất lưu trữ có thứ tự và không được lặp lại các phần tử nên Set trong Java được coi là một tập hợp (có thể là tập hợp số, tập hợp chữ, tập hợp ký tự…) và đây cũng là lý do mà Set trong Java có thể thực hiện các phép toán của tập hợp.

Như trong một ví dụ dưới đây, tôi có hai Set (hoặc có thể coi là 2 tập hợp). Trong đó, set1 = [22, 45, 33, 66, 55, 34, 77] set2 = [33, 2, 83, 45, 3, 12, 55] khi đó ta có các phép toán:

  • Giao hoán: Phép toán giao hoán sẽ trả về tất cả các phần tử có trong cả tập hợp. Giao hoán của set1set2 sẽ là [33, 45, 55].
  • Phép hợp: Phép toán hợp sẽ trả về tất cả các phần tử của set1set2 trong một tập hợp duy nhất và tập hợp đó có thể là set1 hoặc set2. Hợp nhất các phần tử của set1set2 sẽ cho ra kết quả là [2, 3, 12, 22, 33, 34, 45, 55, 66, 77, 83].
  • Phép trừ: Phép toán trừ giữa hai tập hợp sẽ loại bỏ đi các giá trị khỏi tập hợp có trong một tập hợp khác.Phép toán trừ của set1 trừ set2 sẽ cho ra kết quả [66, 34, 22, 77]. – kết quả này sẽ chỉ giữ lại các phần tử có trong set1 nhưng không có trong set2.

Trong ngôn ngữ lập trình Java và trong Interface Set, phương thức Set.addAll() được sử dụng để thực hiện phép hợp, phương thức Set.retainAll() được sử dụng để thực hiện phép giao nhau giữa hai và phương thức Set.removeAll() được sử dụng để thực hiện phép trừ.

Mời các bạn tham khảo ví dụ dưới đây để hiểu rõ hơn về các phép toán trên tập hợp khi sử dụng trong ngôn ngữ lập trình Java thông qua Interface Set:

import java.util.*;    
public class Main
{    
    public static void main(String args[])    
    {    
    	  //Khoi tao set1 va set2 tu mang voi kieu Integer
          Integer[] A = {22, 45,33, 66, 55, 34, 77};  
          Integer[] B = {33, 2, 83, 45, 3, 12, 55};  
          Set<Integer> set1 = new HashSet<Integer>();    
          set1.addAll(Arrays.asList(A));    
          Set<Integer> set2 = new HashSet<Integer>();    
          set2.addAll(Arrays.asList(B));    

          //Thuc hien phep toan hop giua set1 va set2
          Set<Integer> union_data = new HashSet<Integer>(set1);    
          union_data.addAll(set2);    
          System.out.print("Phep hop giua set1 voi set2 la:");    
          System.out.println(union_data);    

          //Thuc hien phep toan giao giua set1 va set2  
          Set<Integer> intersection_data = new HashSet<Integer>(set1);    
          intersection_data.retainAll(set2);    
          System.out.print("Phep giao giua set1 va set2 la:");    
          System.out.println(intersection_data);    

          //Thuc hien phep toan tru giua set1 va set2   
          Set<Integer> difference_data = new HashSet<Integer>(set1);    
          difference_data.removeAll(set2);    
          System.out.print("Phep tru cua set1 tru set2 la:");    
          System.out.println(difference_data);    
    }    
}

Kết quả:

Phep hop giua set1 voi set2 la:[33, 66, 34, 2, 83, 3, 22, 55, 12, 45, 77]
Phep giao giua set1 va set2 la:[33, 55, 45]
Phep tru cua set1 tru set2 la:[66, 34, 22, 77]

3.2 Thêm phần tử vào Set trong Java

Phương thức Set.add() được sử dụng để chèn một giá trị mới vào Set. Phương thức trả về truefalse tùy thuộc vào kết quả của việc chèn phần tử mới vào Set. Nó trả về false nếu phần tử đã có trong tập hợp và trả về true nếu phần tử đó không có trong tập hợp.

import java.io.*;   
import java.util.*;   
public class Main {   
    public static void main(String args[]){   
    	//Khoi tao set voi kieu Integer su dung LinkedHashSet()
    	Set<Integer> set = new LinkedHashSet<Integer>(); 
        //Kiem tra set vua tao co rong hay khong?
        boolean result = set.isEmpty();
        System.out.println("Set vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set);  
        //Them phan tu vao trong Set voi phuong thuc add()
        set.add(31);   
        set.add(21);   
        set.add(41);   
        set.add(11);   
        set.add(61);   
        set.add(51);  
        //Kiem tra set sau khi them phan tu co rong khong?
        boolean result2 = set.isEmpty();
        System.out.println("Set sau khi them phan tu co rong khong? \n" + result2); 
        System.out.println("Phan tu co trong Set la: \n" + set);   
    }   
}

Kết quả:

Set vua tao co rong hay khong? 
true
Phan tu co trong Set la: 
[]
Set sau khi them phan tu co rong khong? 
false
Phan tu co trong Set la: 
[31, 21, 41, 11, 61, 51]

3.3 Kiểm tra phần tử có thuộc trong Set

Phương thức Set.contains() được sử dụng để kiểm tra sự hiện diện của một phần tử trong tập hợp. Giá trị trả về của phương thức này sẽ là true hoặc false tùy thuộc vào sự hiện diện của phần tử có trong Set. Nếu như phần tử có trong Set thì nó trả về true, ngược lại trả về false.

import java.io.*;   
import java.util.*;   
class Main{   
    public static void main(String args[]){
    	//Khoi tao set voi kieu string su dung LinkedHashSet()
    	Set<Integer> set = new LinkedHashSet<Integer>();   
        set.add(31);   
        set.add(21);   
        set.add(41);   
        set.add(51);   
        set.add(11);   
        set.add(81);   
        //Hien thi cac phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set);  
        //Kiem tra cac phan tu co thuoc trong set hay khong?
        System.out.println("Phan tu 91 co thuoc trong Set khong? \n" + set.contains(91));   
        System.out.println("Phan tu 'Laptrinhtudau' co thuoc trong Set khong? \n" + set.contains("Laptrinhtudau"));  
        System.out.println("Phan tu 51 co thuoc trong Set khong? \n" + set.contains(51));  
    }   
}

Kết quả:

Phan tu co trong Set la: 
[31, 21, 41, 51, 11, 81]
Phan tu 91 co thuoc trong Set khong? 
false
Phan tu 'Laptrinhtudau' co thuoc trong Set khong? 
false
Phan tu 51 co thuoc trong Set khong? 
true

3.4 Xóa phần tử trong Set

Phương thức Set.remove() được sử dụng để xóa một phần tử được chỉ định khỏi tập hợp Set. Giá trị trả về của phương thức này phụ thuộc vào việc có xóa phần tử thành công hay không. Nó trả về true nếu phần tử đã được xóa trong tập hợp và trả về false nếu phần tử đó không được xóa trong tập hợp vì không tồn tại nó trong tập hợp.

import java.io.*;   
import java.util.*;   
class Main {   
    public static void main(String args[]){
    	//Khoi tao set voi kieu string su dung LinkedHashSet()
    	Set<Integer> set = new LinkedHashSet<Integer>();   
        set.add(31);   
        set.add(21);   
        set.add(41);   
        set.add(51);   
        set.add(11);   
        set.add(81);   
        //Hien thi cac phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set); 
        //Xoa di phan tu 81,21,11 trong Set
        set.remove(81);  
        set.remove(21);  
        set.remove(11);      
        //Hien thi cac phan tu trong set sau khi xoa
        System.out.println("Phan tu co trong Set sau khi xoa la: \n" + set); 
    }   
}

Kết quả:

Phan tu co trong Set la: 
[31, 21, 41, 51, 11, 81]
Phan tu co trong Set sau khi xoa la: 
[31, 41, 51]

Phương thức Set.remove() ở trên chỉ cho phép chúng ta xóa riêng lẻ từng phần tử. Nếu như bạn cần xóa bỏ đi tất các các phần tử có trong Set đó, khi đó bạn sẽ cần sử dụng đến phương thức Set.clear() để thực hiện điều này:

import java.io.*;   
import java.util.*;   
class Main {   
    public static void main(String args[]){
    	//Khoi tao set voi kieu string su dung LinkedHashSet()
    	Set<Integer> set = new LinkedHashSet<Integer>();   
        set.add(31);   
        set.add(21);   
        set.add(41);   
        set.add(51);   
        set.add(11);   
        set.add(81);   
        //Hien thi cac phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set); 
        //Xoa toan bo cac phan tu co trong Set
        set.clear();       
        //Hien thi cac phan tu trong set sau khi xoa
        System.out.println("Phan tu co trong Set sau khi xoa la: \n" + set); 
    }   
}

Kết quả:

Phan tu co trong Set la: 
[31, 21, 41, 51, 11, 81]
Phan tu co trong Set sau khi xoa la: 
[]

3.5 Duyệt các phần tử trong Set

Phương thức Set.iterator() được sử dụng để nạp trình lặp của một tập hợp. Trình lặp được sử dụng để lấy từng phần tử một có trong Set. Kết hợp với vòng lặp ta có thêt sử dụng Set.iterator() để duyệt qua tất cả các phần tử có trong Set như sau:

import java.io.*;   
import java.util.*;   
class Main {   
    public static void main(String args[]){
    	//Khoi tao set voi kieu string su dung LinkedHashSet()
    	Set<Integer> set = new LinkedHashSet<Integer>();   
        set.add(31);   
        set.add(21);   
        set.add(41);   
        set.add(51);   
        set.add(11);   
        set.add(81);   
        //Hien thi cac phan tu trong set
        System.out.println("Phan tu co trong Set la: \n" + set); 
        //Tao doi tuong lap Iterator cho Set
        Iterator newset = set.iterator();  
        System.out.println("Cac phan tu duoc lap trong newset la: ");   
        while (newset.hasNext()){   
        	//Goi den phan tu tiep theo trong moi lan lap
            System.out.println(newset.next());   
        }   
    }   
}

Kết quả:

Phan tu co trong Set la: 
[31, 21, 41, 51, 11, 81]
Cac phan tu duoc lap trong newset la: 
31
21
41
51
11
81

4. Các phương thức của Set trong Java

Trong các ví dụ trên, chúng tôi đã giới thiệu cho các bạn một vài phương thức của Set như: Set.add(), Set.remove(), Set.iterator()…Bảng dưới đây sẽ tiếp tục bổ xung thêm một số phương thức để chúng ta dễ dàng hơn khi thao tác với Set trong Java.

Phương thức Mô tả
add() Thêm phần tử vào trong Set.
clear() Xóa toàn bộ phần tử trong Set.
contains() Kiểm tra phần tử có tồn tại trong Set hay không? Trả về true nếu tồn tại, ngược lại trả về false.
isEmpty() Kiểm tra Set có rỗng hay không?
iterator() Trả về một đối tượng Iterator cho Collection mà có thể được sử dụng để thu nhận một đối tượng
remove() Xóa đi một phần tử được chỉ định trong Set.
size() Kiểm tra số lượng phần tử có trong Set.