Java Set – Java中的Set

Java Set(集合)是一个包含没有重复元素的元素(或对象)的集合。Java Set是扩展Collection接口的接口。与List不同,Java Set不是有序集合,它的元素没有特定的顺序。Java Set不提供在特定位置插入元素的控制。

Java Set

在本节中,我们将讨论Java Set的一些重要点:

  • Java Set接口是Java集合框架的成员。
  • 与List不同,Set 不允许 添加重复元素。
  • Set允许添加最多一个null元素。
  • Java 8中Set接口有一个默认方法:spliterator。
  • 与List和数组不同,Set不支持其元素的索引或位置。
  • Set支持泛型,我们应该在可能的情况下使用它。在运行时,使用泛型与Set将避免ClassCastException。
  • 我们可以使用Set接口的实现来维护唯一的元素。

Java Set 类图

Java Set 接口扩展了 Collection 接口。Collection 接口扩展了 Iterable 接口。一些常用的 Set 实现类包括 HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet 和 ConcurrentSkipListSet。AbstractSet 提供了 Set 接口的骨架实现,以减少实现 Set 的工作量。

Java Set 方法

在本节中,我们将讨论一些有用的 Java Set 方法:

  1. int size(): 获取集合中元素的数量。
  2. boolean isEmpty(): 检查集合是否为空。
  3. boolean contains(Object o): 如果此集合包含指定的元素,则返回 true。
  4. Iterator iterator(): 返回此集合中元素的迭代器。元素以无特定顺序返回。
  5. Object[] toArray(): 返回包含此集合中所有元素的数组。如果此集合对其元素由其迭代器返回的顺序有任何保证,则此方法必须以相同顺序返回元素。
  6. boolean add(E e): 如果指定的元素尚未存在,则将其添加到此集合中(可选操作)。
  7. boolean remove(Object o): 如果存在指定的元素,则从此集合中移除它(可选操作)。
  8. boolean removeAll(Collection c): 从此集合中移除包含在指定集合中的所有元素(可选操作)。
  9. boolean retainAll(Collection c): 仅保留此集合中包含在指定集合中的元素(可选操作)。
  10. void clear(): 从集合中移除所有元素。
  11. Iterator iterator(): 返回此集合中元素的迭代器。

Java数组转换为集合

与列表不同,我们无法直接将Java集合转换为数组,因为它不是使用数组实现的。因此,我们不能使用Arrays类来获取数组的视图作为集合。我们可以采用另一种方法。我们可以使用Arrays.asList()方法将数组转换为列表,然后使用它来创建集合。通过使用这种方法,我们可以以两种方式将Java数组转换为集合。让我们逐一讨论它们,使用一个简单的示例。 方法一 在此方法中,首先我们需要使用给定的数组创建一个列表,然后使用它来创建一个集合,如下所示。

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);
   }
}

方法二 在这种方法中,我们不使用中间列表来从数组创建集合。首先创建一个空的 HashSet,然后使用 Collections.addAll() 将数组元素复制到给定的集合中,如下所示。

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);
   }
}

输出:- 当我们运行上述两个程序时,将得到如下所示的相同输出。

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

Java 集合转数组

在这一部分,我们将编写一个程序,使用 Set.toArray() 方法将一组字符串转换为字符串数组,如下所示。

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set();

	// 添加示例
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// 将集合转换为数组
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

输出:- 当我们运行上述程序时,将得到如下所示的输出。

[a, e, u, i, o]

Java 集合排序

正如我们所知,集合(HashSet)不直接支持对元素进行排序。它以随机顺序存储和显示元素。然而,我们有一些方法来对其元素进行排序,如下所示:

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);
	}
}

输出:- 当我们运行上述程序时,将看到以下输出。

[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]

Java Set 常见操作

在 Java Set 上执行的最常见操作包括 add、addAll、clear、size 等。下面是一个简单的 Java Set 示例,展示了常见方法的使用。

import java.util.*;

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

	// 我们不能根据索引向集合中插入元素
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	// 将集合元素追加到 letters 中
	vowels.addAll(set);
	System.out.println(vowels);
	
	// 清空示例以清空集合
	set.clear();
		
	// 大小示例
	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"));
		
   }
}

输出:

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

Java Set 迭代器

下面是一个简单示例,展示了如何迭代 Java Set。

import java.util.*;

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

	Set set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	// 简单迭代
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	// 使用迭代器修改集合
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	// 在迭代时更改集合结构
	iterator = set.iterator();
	while(iterator.hasNext()){
                // 这里会抛出 ConcurrentModificationException
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Java Set 转 Stream

下面是一个简单示例,展示了如何将 Java Set 转换为 Stream 并根据我们的需求执行一些操作。

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set vowelsSet = new HashSet<>();
	// 添加示例
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// 将集合转换为流
	vowelsSet.stream().forEach(System.out::println);
   }
}

输出:-

a
e
u
i
o

Java SE 9 集合

在 Java SE 9 发布中,Oracle 公司将向 Set 接口添加一些有用的实用方法。最好通过一些简单而有用的示例来理解它们。请阅读我的教程“Java SE 9:集合工厂方法”来学习它们。这就是关于 Java 中集合的快速概述。希望这些 Java 集合示例能帮助你开始使用集合编程。感谢阅读我的教程。如果您喜欢我的教程,或者有任何问题、建议或任何类型的错误,请留下评论。

Source:
https://www.digitalocean.com/community/tutorials/java-set