ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java HashSet

2022-04-21 14:00:57  阅读:177  来源: 互联网

标签:Java HashMap HashSet hs 元素 add new


Java HashSet

HashSet的概念:

HashSet是基于HashMap来实现的,实现了set接口,同时还实现了序列化和可克隆话。而集合Set是不允许重复的值。

所以 HashSet是一个没有重复元素的集合,但是不能保证集合的迭代顺序,所以随着时间元素的顺序可能会改变。

由于HashSet是基于HashMap来实现的吗,所以不允许有空值。

Java文档中HashSet的实现

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 的构造函数

HashSet()

该构造函数用于构造一个空的HashSet对象,其中默认初始容量为16,默认加载因子为0.75

创建实例:

HashSet<E> has = new HashSet<E>();

HashSet(int initialCapacity)

该构造函数用于构建一个空的HashSet对象,在对象创建时指定initialCapacity。这里,默认的 loadFactor 保持为 0.75。

initialCapacity就是初始容量,loadFactor是负载因子。示例:如果初始容量为 16,负载因子为 0.75,则当表中有 12 个元素时,桶的数量将自动增加。

示例:

HashSet<E> hs = new HashSet<E>(int initialCapacity);

HashSet(int initialCapacity, float loadFactor)

该构造函数用于构建一个空的HashSet对象,其中在创建对象时指定了initialCapacity和loadFactor。

示例:

HashSet<E> hs = new HashSet<E>(int initialCapacity, float loadFactor);

HashSet(Collection)

此构造函数用于构建包含给定集合中所有元素的 HashSet 对象。简而言之,当需要从任何 Collection 对象到 HashSet 对象的任何转换时,都会使用此构造函数。如果我们希望创建一个名为 hs 的 HashSet,它可以创建为:

示例:

HashSet<E> hs = new HashSet<E>(Collection C);

HashSet的操作

添加元素 add()

使用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]

删除元素 remove()

// 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

遍历HashSet iterator()

使用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)时间。

HashSet操作表格

变量和类型 方法 描述
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 。

文档参考菜鸟教程

标签:Java,HashMap,HashSet,hs,元素,add,new
来源: https://www.cnblogs.com/beimengRock/p/16173837.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有