什么是 Java 集
Set是来自 Java Collection Framework 的接口,但Set不是有序集合,这与List不同。这意味着 Java Set元素的保存没有特定的顺序。因此无法控制可以插入元素的位置。您也不能通过索引访问元素。从数学上讲,Set是唯一元素的集合。实际上,这是一个无序集合(unordered Collection),其中不能存储相同的元素。如果您有意向Set添加重复元素,则此操作将被忽略并且Set不会更改。但是允许在其中存储一个空元素。设置实现
Java Set是一个接口,因此您需要使用其实现之一来创建对象。它们是HashSet、TreeSet和LinkedHashSet。在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 个Set,HashSet和LinkedHashSet,并为每个添加了 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);
}
}
这是程序的输出:
Java 设置方法
以下是 Java Set 的一些重要方法:-
布尔加法(E e)。如果指定的元素不存在,则将其添加到集合中(可选操作)。
-
布尔删除(对象 o)。如果指定元素存在(可选操作),则从该集合中移除指定元素。
-
布尔 removeAll(Collection c)。从此集合中删除指定集合中包含的所有元素(可选操作)。
-
布尔保留全部(集合 c)。仅保留此集合中包含在指定集合中的元素(可选操作)。
-
无效清除()。从集合中移除所有元素。
-
迭代器 iterator()。返回此集合中元素的迭代器。
-
整数大小()。它用于获取 Set 中元素的数量。
-
布尔 isEmpty()。检查 Set 是否为空。
-
布尔值包含(对象 o)。如果此 Set 包含指定元素,则返回 true。
-
迭代器 iterator()。返回此集合中元素的迭代器。返回的元素没有特定的顺序。
-
对象[] 到数组()。返回包含此集合中所有元素的数组。如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。
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());
}
}
该程序的输出在这里:
使用 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]);
}
}
这是程序的输出:
使用迭代器设置示例
让我们创建一个集合,然后使用迭代器将其打印出来,然后从中删除所有偶数,同样使用迭代器。
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);
}
}
该程序的输出在这里:
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 的一部分。
-
实现的类:AbstractSet、ConcurrentHashMap.KeySetView、ConcurrentSkipListSet、CopyOnWriteArraySet、EnumSet、HashSet、JobStateReasons、LinkedHashSet、TreeSet。
-
最流行的Set实现是HashSet、LinkedHashSet和TreeSet。
-
HashSet元素顺序由复杂的算法确定。如果存储顺序对您很重要,请使用TreeSet容器,它存储按比较顺序按升序排序的对象,或者使用LinkedHashSet,它按加法顺序存储元素。
-
大多数情况下,集合用于测试成员资格。也就是说,检查一个对象是否属于数学意义上的给定集合。因此,在实践中,大多数情况下,在所有Set实现中,通常会选择HashSet 。此实现针对快速搜索进行了优化。
-
您不能向集合中添加重复元素,因此您可以使用Set接口的实现来存储唯一元素。
-
Set允许您只添加一个空元素。
-
Set不是列表,不支持其元素的索引或位置。
GO TO FULL VERSION