Core Java Tutorial -,corejavatutorial
Core Java Tutorial -,corejavatutorial
Java Set 是不包含重复元素(或对象)的集合。Java Set 是一个 extends 了 Collection 接口的接口。与 List 不同,Java Set 不是一个有序集合,它的元素没有特定的顺序。Java Set 不提供可以插入元素位置的控制。你不能按照索引访问元素,也不能在列表中搜索元素。
1. Java Set
在这节,我们将讨论一些关于 Java Set 的重点:
- Java Set 接口是 Java 集合框架的成员。
- 与 List 不同,Set 不允许添加重复元素。
- Set 允许你只添加一个 null 元素。
- Set 接口在 Java 8 中有一个默认方法:spliterator。
- 与 Like 和数组不同,Set 不支持元素的索引或位置。
- Set 支持泛型,我们应该尽可能使用它。在集合中使用泛型将在运行时避免
ClassCastException
错误。 - 我们可以使用 Set 接口实现来维护独特的元素。
Java Set Class Diagram
Java Set 接口集成了 Collection 接口。Collection 接口继承了 Iterable 接口。一些经常使用的 Set 实现类有:HashSet
、LinkedHashSet
、TreeSet
、CopyOnWriteArraySet
和 ConcurrentSkipListSet
。AbstractSet
提供了 Set 接口的骨架实现,以减少实现 Set 的工作量。
Java Set Methods
在本节中,我们将讨论一些有用的 Java Set 方法:
int size()
:获取 Set 中元素的数量。boolean isEmpty()
:检查 Set 是否为空。boolean contains(Object o)
:如果此 Set 中包含指定元素,则返回 true。Iterator iterator()
:返回此 Set 中元素的迭代器。元素以特定顺序返回。Object[] toArray()
:返回包含此 Set 中所有元素的数组。如果这个集合保证了它的迭代器返回的元素的顺序,这个方法必须以相同的顺序返回元素。boolean add(E e)
:如果指定的元素不存在(可选操作),则将指定的元素添加到此 Set 中。boolean remove(Object o)
:如果存在指定的元素(可选操作),则从该 Set 中删除指定的元素。boolean removeAll(Collection c)
:从该 Set 中移除指定集合中包含的所有元素(可选操作)。boolean retainAll(Collection c)
:仅保留包含在指定集合中的元素(可选操作)。void clear()
:删除 Set 中的所有元素。Iterator iterator()
:返回此 Set 中元素的迭代器。
Java Array to Set
不像 List,我们不能直接将 Java Array 转换成 Java Set,因为它不是使用 Array 实现的。
所以我们不能使用 Arrays 类来获得 Set 的数组试图。我们可以采用另一种方法。我们可以使用 Arrays.asList()
方法将数组转换为 List,然后使用它创建 Set。通过这种方法,我们可以通过两种方式来将 Java Array 转换成 Set。让我们来用一个简单的栗子注意讨论它们。
方法一:
这个方法,首先我们需要用给出的数组创建一个 List,然后用它创建一个 Set。如下所示:
package Set;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
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);
}
}
方法二:
在这种方法中,我们不使用中间 List 来从数值创建 Set。 首先创建一个空的 HashSet,然后使用 Collections.addAll()
将数组元素复制到给定的 Set 中,如下所示:
package Set;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
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 to Array
在本节中,我们将编写一个程序,使用 Set.toArray()
方法将一组字符串转换为一个字符串数组,如下所示:
package Set;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
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 Set Sorting
正如我们所知,Set(HashSet)不直接支持排序元素。它们以随机顺序存储和显示它的元素。
但是,我们有一些方法来对它的元素进行排序,如:
// TODO
Java Set Common Operations
在 Java Set 上执行的最常见的操作是add
、addAll
、clear
、size
等。下面是一个简单的Java Set示例,显示常见的方法用法。
package Set;
import java.util.HashSet;
import java.util.Set;
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 Set Iterator
下面是一个简单的例子,展示了如何迭代 Java Set。
package Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
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 to Stream
下面是一个简单的例子,展示了如何将 Java Set 转换为 Stream 并按照我们的要求执行一些操作。
package Set;
import java.util.HashSet;
import java.util.Set;
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 Set
在 Java SE 9 发行版中,Oracle Corp 将为 Set 接口添加一些有用的实用方法。 用一些简单而有用的例子来理解它们会更好。
请通过 “Java SE 9: Set Factory Methods”来学习它们。
相关文章
- 暂无相关文章
用户点评