Java集合 – Java中的Set

Java 集合

在这个部分,我们将讨论关于Java Set的一些重要要点。

  • Java Set interface is a member of the Java Collections Framework.
  • Unlike List, Set DOES NOT allow you to add duplicate elements.
  • Set allows you to add at most one null element only.
  • Set interface got one default method in Java 8: spliterator.
  • Unlike List and arrays, Set does NOT support indexes or positions of it’s elements.
  • Set supports Generics and we should use it whenever possible. Using Generics with Set will avoid ClassCastException at runtime.
  • We can use Set interface implementations to maintain unique elements.

Java Set类的类图

Java的集合方法

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

    获取集合中元素的数量。
    检查集合是否为空。
    如果集合包含指定的元素,则返回true。
    返回一个迭代器,用于遍历集合中的元素。元素的返回顺序没有特定的顺序。
    返回一个包含集合中所有元素的数组。如果集合对元素的迭代器返回顺序有任何保证,那么该方法必须以相同的顺序返回元素。
    如果指定的元素不存在于集合中,则将其添加到集合中(可选操作)。
    如果指定的元素存在于集合中,则将其从集合中删除(可选操作)。
    从集合中删除包含在指定集合中的所有元素(可选操作)。
    仅保留集合中包含在指定集合中的元素(可选操作)。
    从集合中删除所有元素。
    返回一个迭代器,用于遍历集合中的元素。

Java数组转换为集合

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

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

第二种方法是在这个方法中,我们不使用中间列表来从数组创建一个集合。首先创建一个空的哈希集,然后使用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转换为数组。

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

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

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

[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集合的常见操作

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

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

结果:

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

Java的集合迭代器

下面是一个简单的示例,展示了如何迭代遍历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);
	}
   }
}

将 Java 的 Set 转换为 Stream。

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

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

产出:

a
e
u
i
o

Java SE 9 集合

在Java SE 9版本中,Oracle Corp将向Set接口添加一些实用的工具方法。最好通过一些简单实用的示例来理解它们。请阅读我在“Java SE 9:Set Factory Methods”上的教程来学习它们。这就是对Java中Set的快速概述。我希望这些Java Set示例能帮助您入门Set集合编程。感谢您阅读我的教程。如果您喜欢我的教程,或者有任何问题、建议或任何类型的错误,请给我留言。

发表回复 0

Your email address will not be published. Required fields are marked *