HashSet是基于HashMap来实现的,实现了set接口,同时还实现了序列化和可克隆话。而集合Set是不允许重复的值。
所以 HashSet是一个没有重复元素的集合,但是不能保证集合的迭代顺序,所以随着时间元素的顺序可能会改变。
由于HashSet是基于HashMap来实现的吗,所以不允许有空值。
HashSet是基于HashMap实现的,区别就在于在HashMap中输入一个键值对,而在HashSet中只输入一个值。
java代码:
private transient HashMap map; // Constructor - 1 // All the constructors are internally creating HashMap Object. public HashSet() { // Creating internally backing HashMap object map = new HashMap(); } // Constructor - 2 public HashSet(int initialCapacity) { // Creating internally backing HashMap object map = new HashMap(initialCapacity); } // Dummy value to associate with an Object in Map private static final Object PRESENT = new Object();
而HashSet类的add的实现是这样子的,很明显可以看到是调用了HashMap里的put()方法。而里面的present则是常量,就是没用的。
public boolean add(E e) { return map.put(e, PRESENT) == null; }
该构造函数用于构造一个空的HashSet对象,其中默认初始容量为16,默认加载因子为0.75
创建实例:
HashSet<E> has = new HashSet<E>();
该构造函数用于构建一个空的HashSet对象,在对象创建时指定initialCapacity。这里,默认的 loadFactor 保持为 0.75。
initialCapacity就是初始容量,loadFactor是负载因子。示例:如果初始容量为 16,负载因子为 0.75,则当表中有 12 个元素时,桶的数量将自动增加。
示例:
HashSet<E> hs = new HashSet<E>(int initialCapacity);
该构造函数用于构建一个空的HashSet对象,其中在创建对象时指定了initialCapacity和loadFactor。
示例:
HashSet<E> hs = new HashSet<E>(int initialCapacity, float loadFactor);
此构造函数用于构建包含给定集合中所有元素的 HashSet 对象。简而言之,当需要从任何 Collection 对象到 HashSet 对象的任何转换时,都会使用此构造函数。如果我们希望创建一个名为 hs 的 HashSet,它可以创建为:
示例:
HashSet<E> hs = new HashSet<E>(Collection C);
使用add() 但是HashSet不会储存重复的元素,所以add相同的不会加进去。
// Java program to Adding Elements to HashSet // Importing required classes import java.io.*; import java.util.*; // Main class // AddingElementsToHashSet class GFG { // Method 1 // Main driver method public static void main(String[] args) { // Creating an empty HashSet of string entities HashSet<String> hs = new HashSet<String>(); // Adding elements using add() method hs.add("Geek"); hs.add("For"); hs.add("Geeks"); // Printing all string el=ntries inside the Set System.out.println("HashSet elements : " + hs); } }
输出结果:
HashSet elements : [Geek, For, Geeks]
// Java program Illustrating Removal Of Elements of HashSet // Importing required classes import java.io.*; import java.util.*; // Main class // RemoveElementsOfHashSet class GFG { // Main driver method public static void main(String[] args) { // Creating an HashSet<String> hs = new HashSet<String>(); // Adding elements to above Set // using add() method hs.add("Geek"); hs.add("For"); hs.add("Geeks"); hs.add("A"); hs.add("B"); hs.add("Z"); // Printing the elements of HashSet elements System.out.println("Initial HashSet " + hs); // Removing the element B hs.remove("B"); // Printing the updated HashSet elements System.out.println("After removing element " + hs); // Returns false if the element is not present System.out.println("Element AC exists in the Set : " + hs.remove("AC")); } }
输出:
Initial HashSet [A, B, Geek, For, Geeks, Z]
移除元素后 [A, Geek, For, Geeks, Z]
元素AC存在于Set中:false
使用iterator()遍历,也就是迭代器 还有一种就是使用for循环。
// Java Program to Illustrate Iteration Over HashSet // Importing required classes import java.io.*; import java.util.*; // Main class // IterateTheHashSet class GFG { // Main driver method public static void main(String[] args) { // Creating an empty HashSet of string entries HashSet<String> hs = new HashSet<String>(); // Adding elements to above Set // using add() method hs.add("Geek"); hs.add("For"); hs.add("Geeks"); hs.add("A"); hs.add("B"); hs.add("Z"); // Iterating though the HashSet using iterators Iterator itr = hs.iterator(); // Holds true till there is single element // remaining in Set while (itr.hasNext()) // Traversing elements and printing them System.out.print(itr.next() + ", "); System.out.println(); // Using enhanced for loop for traversal for (String s : hs) // Traversing elements and printing them System.out.print(s + ", "); System.out.println(); } }
输出:
A,B,极客,对于,极客,Z,
A,B,极客,对于,极客,Z,
ashSet 操作的时间复杂度:HashSet的底层数据结构是 hashtable。因此,HashSet
的添加、删除和查找(包含方法)操作的摊销(平均或通常情况)时间复杂度需要O(1)时间。
变量和类型 | 方法 | 描述 |
---|---|---|
boolean | add(E e) | 如果指定的元素不存在,将其添加到集合中 |
void | clear() | 从该集中删除所有元素。 |
Object | clone() | 返回此 HashSet实例的浅表副本:未克隆元素本身。 |
boolean | contains(Object o) | 如果此set包含指定的元素,则返回 true 。 |
boolean | isEmpty() | 如果此集合不包含任何元素,则返回 true 。 |
Iterator | iterator() | 返回此set中元素的迭代器。 |
boolean | remove(Object o) | 如果存在,则从该集合中移除指定的元素。 |
int | size() | 返回此集合中的元素数(基数)。 |
Spliterator | spliterator() | 在此集合中的元素上创建late-binding和失败快速 Spliterator 。 |
文档参考菜鸟教程