Trang chủHướng dẫnSet trong Java: Khái niệm, các loại Set và ví dụ minh họa chi tiết
Java

Set trong Java: Khái niệm, các loại Set và ví dụ minh họa chi tiết

CyStack blog 6 phút để đọc
CyStack blog11/09/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 6 minutes

Set trong Java là một tập hợp các phần tử (hoặc objects) không chứa phần tử trùng lặp. Java Set là một giao diện mở rộng từ giao diện Collection. Khác với List, Java Set không phải là một tập hợp có thứ tự, nghĩa là các phần tử không có thứ tự cố định.

set trong java

Nó không cho phép kiểm soát vị trí chèn phần tử. Bạn không thể truy cập phần tử bằng chỉ số (index) và cũng không thể tìm kiếm phần tử theo cách giống như trong List.

Set trong Java

Trong phần này, chúng ta sẽ thảo luận một số điểm quan trọng về Java Set:

  • Giao diện Java Set là một thành viên của Java Collections Framework.
  • Khác với List, Set KHÔNG cho phép bạn thêm phần tử trùng lặp.
  • Set cho phép bạn thêm nhiều nhất một phần tử null.
  • Giao diện Set có một default method trong Java 8: spliterator.
  • Khác với List và mảng, Set KHÔNG hỗ trợ index hoặc vị trí của các phần tử.
  • Set hỗ trợ Generics và chúng ta nên sử dụng bất cứ khi nào có thể. Việc sử dụng Generics với Set sẽ giúp tránh ClassCastException tại runtime.
  • Chúng ta có thể sử dụng các implementation của Set interface để duy trì các phần tử duy nhất.

Sơ đồ lớp Java Set

Interface Set trong Java kế thừa từ interface Collection. Interface Collection lại kế thừa từ interface Iterable. Một số lớp cài đặt (implementation class) thường dùng của Set bao gồm: HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet và ConcurrentSkipListSet.

Lớp AbstractSet cung cấp một bản cài đặt khung (skeletal implementation) cho interface Set nhằm giảm bớt công sức khi hiện thực Set.

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

Trong phần này chúng ta sẽ thảo luận một số phương thức hữu ích của Java Set:

  1. int size(): lấy số lượng phần tử trong Set. boolean isEmpty(): kiểm tra Set có rỗng hay không.
  2. boolean contains(Object o): trả về true nếu Set chứa phần tử được chỉ định.
  3. Iterator iterator(): trả về một iterator (biến lặp) cho các phần tử trong Set. Các phần tử được trả về không theo một thứ tự cụ thể.
  4. Object\[] toArray(): trả về một mảng chứa tất cả các phần tử trong Set. Nếu Set có đảm bảo về thứ tự phần tử do iterator trả về, method này phải trả về theo cùng thứ tự đó.
  5. boolean add(E e): thêm phần tử được chỉ định vào Set nếu nó chưa tồn tại (optional operation).
  6. boolean remove(Object o): xóa phần tử được chỉ định khỏi Set nếu nó tồn tại (optional operation).
  7. boolean removeAll(Collection c): xóa tất cả các phần tử trong Set mà có trong Collection chỉ định (optional operation). boolean retainAll(Collection c): chỉ giữ lại các phần tử trong Set mà có trong Collection chỉ định (optional operation).
  8. void clear(): xóa tất cả phần tử khỏi Set.
  9. Iterator iterator(): trả về một iterator cho các phần tử trong Set.

Chuyển đổi Mảng thành Set trong Java

Khác với List, chúng ta không thể chuyển đổi trực tiếp một Java Set thành một mảng vì Set không được cài đặt dựa trên Array. Do đó, chúng ta không thể sử dụng lớp Arrays để có được một view của mảng dưới dạng Set.

Thay vào đó, ta có thể dùng một cách tiếp cận khác: chuyển đổi một array thành List bằng method Arrays.asList(), sau đó dùng nó để tạo ra một Set. Bằng cách này, chúng ta có thể chuyển đổi một Java Array thành Set theo hai cách. Hãy cùng thảo luận từng cách một với một ví dụ đơn giản. Approach-1 Trong cách tiếp cận này, trước tiên chúng ta cần tạo một List từ mảng đã cho, rồi dùng nó để tạo ra một Set, như minh họa dưới đây.

import java.util.*;

public class ArrayToSet {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
	System.out.println(vowelsSet);
	
	/**
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

Approach-2 Trong cách tiếp cận này, chúng ta KHÔNG sử dụng List trung gian để tạo Set từ một Array. Trước tiên, tạo một HashSet rỗng, sau đó dùng Collections.addAll() để sao chép các phần tử của mảng vào Set như minh họa bên dưới.

import java.util.*;

public class ArrayToSet2 {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet<>();
	Collections.addAll(vowelsSet, vowels); 
	System.out.println(vowelsSet);

	/** 
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

Kết quả:- Khi chúng ta chạy hai chương trình trên, sẽ nhận được cùng một kết quả như dưới đây.

[a, e, u, i, o]
[a, u, i, o]
[]

Trong phần này, chúng ta sẽ viết một chương trình để chuyển đổi một Set chứa các String thành một mảng String bằng cách sử dụng method, như minh họa dưới đây.

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set<String< vowelsSet = new HashSet<>();

	// add example
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convert Set to Array
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

Kết quả:- Khi chúng ta chạy chương trình trên, sẽ nhận được kết quả như dưới đây.

[a, e, u, i, o]

Sắp xếp Set trong Java

Như chúng ta đã biết, Set (cụ thể là HashSet) KHÔNG hỗ trợ sắp xếp phần tử trực tiếp. Nó lưu trữ và hiển thị các phần tử theo thứ tự ngẫu nhiên. Tuy nhiên, chúng ta có một số cách tiếp cận để sắp xếp các phần tử của Set, như minh họa dưới đây:

import java.util.*;

public class SetSortingExample {

	public static void main(String[] args) {
		Set<Integer> intsSet = new HashSet<>();
		Random random = new Random();
		for (int i = 0; i  {return (o2-o1);});
		System.out.println("Reverse Sorting: " + intsList2);

		// Approach-3
		Set<Integer> sortedSet = new TreeSet<>(intsSet);
		System.out.println("Sorted Set: " + sortedSet);
	}
}

Kết quả:- Khi chúng ta chạy chương trình trên, chúng ta sẽ thấy kết quả như dưới đây.

[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]

Các thao tác phổ biến trên Java Set

Các thao tác thường dùng nhất trên Java Set là: add, addAll, clear, size, … Dưới đây là một ví dụ đơn giản về Java Set minh họa cách sử dụng các phương thức phổ biến này.

import java.util.*;

public class SetCommonOperations 
{
   public static void main(String args[]) 
   {
	Set<String> vowels= new HashSet<>();
		
	//add example
	vowels.add("A");
	vowels.add("E");
	vowels.add("I");

	//We cannot insert elements based on index to a Set
	System.out.println(vowels);
		
	Set<String> set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//appending set elements to letters
	vowels.addAll(set);
	System.out.println(vowels);
	
	//clear example to empty the set
	set.clear();
		
	//size example
	System.out.println("letters set size = " + vowels.size());
		
	vowels.clear();
	vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
	System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
		
   }
}

Kết quả:-

[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true

Bộ lặp (Iterator) của Set trong Java

Dưới đây là một ví dụ đơn giản minh họa cách lặp lại qua các phần tử trong Java Set.

import java.util.*;

public class SetIteratorExample
{
   public static void main(String[] args) 
   {

	Set<Integer> set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	//simple iteration
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\\n" + set);
	
	//modification of set using iterator
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//changing set structure while iterating
	iterator = set.iterator();
	while(iterator.hasNext()){
                //ConcurrentModificationException here
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Chuyển đổi Set thành Stream

Dưới đây là một ví dụ đơn giản minh họa cách chuyển đổi một Java Set thành Stream và thực hiện một số thao tác theo nhu cầu.

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set<String> vowelsSet = new HashSet<>();
	// add example
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convert set to stream
	vowelsSet.stream().forEach(System.out::println);
   }
}

Kết quả:-

a
e
u
i
o

Java SE 9 Set

Trong phiên bản Java SE 9, Oracle Corp đã bổ sung một số utility methods hữu ích cho giao diện Set. Trên đây là phần tổng kết nhanh về Set trong Java. Tôi hy vọng các ví dụ về Java Set này sẽ giúp bạn bắt đầu với lập trình collection trong Java một cách dễ dàng. Nếu bạn thích bài viết, hoặc có bất kỳ thắc mắc, gợi ý, hay phát hiện lỗi nào, vui lòng để lại bình luận.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất