John Squirrels
第 41 级
San Francisco

Java集

已在 随机的 群组中发布
Set是 Java Collection Framework 中的一个接口。您可以使用 Java Set来实现具有唯一元素的无序集合。在本文中,我们将研究此接口及其在 Java 语言中的实现、使用集合的方法,并提供一些示例。

什么是 Java 集

Set是来自 Java Collection Framework 的接口,但Set不是有序集合,这与List不同。这意味着 Java Set元素的保存没有特定的顺序。因此无法控制可以插入元素的位置。您也不能通过索引访问元素。从数学上讲,Set是唯一元素的集合。实际上,这是一个无序集合(unordered Collection),其中不能存储相同的元素。如果您有意向Set添加重复元素,则此操作将被忽略并且Set不会更改。但是允许在其中存储一个空元素。

设置实现

Java Set是一个接口,因此您需要使用其实现之一来创建对象。它们是HashSetTreeSetLinkedHashSet。在Set中,每个元素仅存储在一个实例中,并且 Set 的不同实现使用不同的顺序来存储元素。在HashSet中,元素的顺序由复杂的算法确定。如果存储顺序对您很重要,请使用TreeSet容器,它存储按比较顺序按升序排序的对象,或LinkedHashSet, 它以加法顺序存储元素。集合通常用于成员资格测试,以便您可以轻松检查对象是否属于给定集合,因此在实践中通常选择针对快速查找进行优化的 HashSet实现。HashSet是一个集合,它使用hashCode()方法返回的它们的哈希值在内部存储元素。即在HashSet<E>内部,存储了HashMap<E, Object>对象,该对象将HashSet的值存储为键。使用哈希码可以让您快速搜索、添加和删除Set中的元素。 LinkedHashSet是一个HashSet它还将元素存储在链表中。普通的HashSet不维护元素顺序。首先,官方根本不存在,其次,只要添加一个元素,即使内部顺序也会发生巨大变化。您可以从LinkedHashSet获取一个迭代器,并使用它按照元素添加到 LinkedHashSet 的确切顺序遍历所有元素。不经常,但有时可能非常必要。TreeSet 是一个将元素存储为按值排序的树的集合。TreeSet<E>内部是一个存储所有这些值的TreeMap<E, Object> 。还有这个TreeMap使用红黑平衡二叉树来存储元素。因此,它具有非常快的add()remove()contains()操作。

创建一个集合对象

要创建一个集合对象,您可以使用下一种形式:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
这是一个简单的示例,我们创建了 2 个SetHashSetLinkedHashSet,并为每个添加了 5 个元素。为此, 我们可以使用add()方法。

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
这是程序的输出:
[亚历克斯、伊戈尔、斯图尔特、约翰尼、贝尔] [斯图尔特、亚历克斯、约翰尼、伊戈尔、贝尔]
正如我们上面提到的,HashSet不维护元素的顺序,而LinkedHashSet维护。LinkedHashSet按照我们将元素写入集合的顺序为我们提供了元素。

Java 设置方法

以下是 Java Set 的一些重要方法:
  • 布尔加法(E e)。如果指定的元素不存在,则将其添加到集合中(可选操作)。

  • 布尔删除(对象 o)。如果指定元素存在(可选操作),则从该集合中移除指定元素。

  • 布尔 removeAll(Collection c)。从此集合中删除指定集合中包含的所有元素(可选操作)。

  • 布尔保留全部(集合 c)。仅保留此集合中包含在指定集合中的元素(可选操作)。

  • 无效清除()。从集合中移除所有元素。

  • 迭代器 iterator()。返回此集合中元素的迭代器。

  • 整数大小()。它用于获取 Set 中元素的数量。

  • 布尔 isEmpty()。检查 Set 是否为空。

  • 布尔值包含(对象 o)。如果此 Set 包含指定元素,则返回 true。

  • 迭代器 iterator()。返回此集合中元素的迭代器。返回的元素没有特定的顺序。

  • 对象[] 到数组()。返回包含此集合中所有元素的数组。如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。

这些方法类似于ArrayList的方法,不同之处在于add(Object o)方法仅将一个对象添加到集合中(如果它不存在)。如果已添加对象,则该方法的返回值为 true,否则为 false。还有一些方法继承自Collection<>接口:parallelStream()removeIf()stream()forEach()方法继承自java.lang.Iterable接口。

Java Set 主要操作示例

在此示例中,我们创建了一个字符串数组,然后使用Arrays.asList操作将其传递给mySet。然后我们删除更多元素,并添加更多元素。在这种情况下,集合中的一个元素已经存在:它不会被添加。我们还将尝试检查是否为空isEmpty()、确定集合的大小 size ()和清除集合中所有元素的操作clear()

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
该程序的输出在这里:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] set 的元素数量 = 5 mySet 是否为空?false 伊戈尔在集合中吗?false 约翰尼在集合中吗?true mySet 现在是空的吗?真的

使用 LinkedHashSet 并设置为 Array 的示例

让我们再写一个程序。在其中,我们将基于LinkedHashSet创建一个集合,向其中添加元素,然后将该集合转换为数组。

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
这是程序的输出:
[C, D, E, F, G, A, B] false 打印删除元素的集合:[C, D, E, G, A, B] 来自集合的新数组:[C, D, E, G, A, B] C

使用迭代器设置示例

让我们创建一个集合,然后使用迭代器将其打印出来,然后从中删除所有偶数,同样使用迭代器。

import java.util.*;

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

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
该程序的输出在这里:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

TreeSet 示例

如果排序对您很重要,请使用TreeSet实现。在这个简短的例子中,我们将用朋友的名字填充集合,就像前面的例子一样。但是,在排序的TreeSet中,元素将立即按排序顺序写入。在这种情况下,名称将按字母顺序显示。

import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
输出是:
[亚历克斯、贝尔、伊戈尔、约翰尼、斯图尔特]

简要结论

  • Java Set接口是 Java Collections Framework 的一部分。

  • 实现的类:AbstractSetConcurrentHashMap.KeySetViewConcurrentSkipListSetCopyOnWriteArraySetEnumSetHashSetJobStateReasonsLinkedHashSetTreeSet

  • 最流行的Set实现是HashSetLinkedHashSetTreeSet

  • HashSet元素顺序由复杂的算法确定。如果存储顺序对您很重要,请使用TreeSet容器,它存储按比较顺序按升序排序的对象,或者使用LinkedHashSet,它按加法顺序存储元素。

  • 大多数情况下,集合用于测试成员资格。也就是说,检查一个对象是否属于数学意义上的给定集合。因此,在实践中,大多数情况下,在所有Set实现中,通常会选择HashSet 。此实现针对快速搜索进行了优化。

  • 您不能向集合中添加重复元素,因此您可以使用Set接口的实现来存储唯一元素。

  • Set允许您只添加一个空元素。

  • Set不是列表,不支持其元素的索引或位置。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION