HashSet<E>

HashSet<E> 是 Java 集合框架中的一个重要类,它实现了 Set<E> 接口,用于存储不重复元素的集合。下面从多个方面详细介绍 HashSet<E> 类。

1. 类定义与继承关系

HashSet<E> 类的定义如下:

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

它继承自 AbstractSet<E> 抽象类,实现了 Set<E>Cloneablejava.io.Serializable 接口。这表明 HashSet 具备集合的基本特性,支持克隆操作,并且可以进行序列化。

2. 底层实现原理

HashSet 底层基于 HashMap 实现。在 HashSet 中,元素被存储为 HashMap 的键,而 HashMap 的值则统一使用一个静态的 PRESENT 对象。通过 HashMap 的哈希表结构,HashSet 能够快速地判断元素是否重复。

3. 主要特性

  • 无序性HashSet 不保证元素的存储顺序,即元素插入的顺序和遍历的顺序可能不同。
  • 唯一性HashSet 不允许存储重复的元素。当添加重复元素时,添加操作会失败。判断元素是否重复是通过元素的 hashCode()equals() 方法来实现的。
  • 允许 null 元素HashSet 允许存储一个 null 元素。

4. 常用构造方法

  • HashSet():创建一个空的 HashSet,初始容量为 16,负载因子为 0.75。
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
    }
}

  • HashSet(Collection<? extends E> c):创建一个包含指定集合中所有元素的 HashSet
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class HashSetExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        HashSet<String> set = new HashSet<>(list);
    }
}

  • HashSet(int initialCapacity):创建一个具有指定初始容量的空 HashSet,负载因子为 0.75。
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>(20);
    }
}

  • HashSet(int initialCapacity, float loadFactor):创建一个具有指定初始容量和负载因子的空 HashSet
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>(20, 0.8f);
    }
}

5. 常用方法

  • boolean add(E e):如果指定元素不存在于集合中,则将其添加到集合中,添加成功返回 true,否则返回 false
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        boolean result = set.add("apple");
        System.out.println(result); // 输出 true
        result = set.add("apple");
        System.out.println(result); // 输出 false
    }
}

  • boolean remove(Object o):如果集合中存在指定元素,则将其移除,移除成功返回 true,否则返回 false
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        boolean result = set.remove("apple");
        System.out.println(result); // 输出 true
    }
}

  • boolean contains(Object o):判断集合中是否包含指定元素,包含返回 true,否则返回 false
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        boolean result = set.contains("apple");
        System.out.println(result); // 输出 true
    }
}

  • int size():返回集合中元素的数量。
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        int size = set.size();
        System.out.println(size); // 输出 2
    }
}

  • void clear():移除集合中的所有元素。
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.clear();
        System.out.println(set.size()); // 输出 0
    }
}

6. 遍历方式

  • 迭代器(Iterator)
import java.util.HashSet;
import java.util.Iterator;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}

  • 增强 for 循环
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        for (String element : set) {
            System.out.println(element);
        }
    }
}

  • Java 8 的 forEach 方法结合 Lambda 表达式
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.forEach(element -> System.out.println(element));
    }
}

7. 性能分析

  • 插入和查找操作HashSet 的插入和查找操作的平均时间复杂度为 O(1),因为它基于哈希表实现。但在最坏情况下(哈希冲突严重),时间复杂度会退化为 O(n)
  • 空间复杂度HashSet 的空间复杂度为 O(n),其中 n 是集合中元素的数量。

8. 注意事项

  • 元素的 hashCode()equals() 方法:为了确保 HashSet 能够正确判断元素是否重复,存储在 HashSet 中的元素必须正确重写 hashCode()equals() 方法。
  • 线程安全HashSet 不是线程安全的。如果需要在多线程环境下使用,可以使用 Collections.synchronizedSet() 方法将其转换为线程安全的集合,或者使用 ConcurrentHashMap 实现的 ConcurrentSkipListSet

综上所述,HashSet 是一个非常实用的集合类,适用于需要存储不重复元素且对插入和查找性能有较高要求的场景。

Java集合框架 文章被收录于专栏

Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。

全部评论

相关推荐

04-30 18:41
已编辑
中山大学
时间线:游戏策划线:3.4笔试3.11约一面3.12一面3.28约二面4.1二面(游戏策划)4.2挂掉😁🐧🐧🐧🐧🐧🐧🐧游戏发行线4.3约群面4.8群面4.9约一面4.11一面,结束后半小时约二面4.14二面,结束后两小时约三面4.17三面,结束后秒过4.18早上约下午hr面4.19云证4.21录用评估敬请期待^_^面经(?):&nbsp;&nbsp;本人游戏经历更专精fps一些,前两次面试官是王者组的,在听说我moba玩的少之后,我感觉的出来他们对我的兴趣不太大。&nbsp;&nbsp;第一次面试我的表现可以说是灾难级别的💩💩💩,脑子像是缠在一起。面试官很友善,但我压力还是很大。面试官考我对游戏的拆解,我在这块没出问题,后来考我设计类问题,我就不知道我自己在说什么鬼了,现在都不敢回想那天的表现😆。不知道为什么还是给我推到二面,我要是这个面试官我就让这个小孩赶紧滚蛋,讲的什么🐶💩ps:而且一面和二面时间隔得超级久&nbsp;&nbsp;二面面试官人很好,开门见山的跟我说了他是王者的,最后很直接的跟我说感觉我去fps项目组更舒服一些😇😇😇听到这句话我就知道拜拜了,他还说会给我推到fps项目组,应该是后面在我的面评里面写了我比较擅长fps,感恩的心🙏🙏🙏&nbsp;🐧🐧🐧🐧🐧🐧🐧🐧🐧&nbsp;&nbsp;然后参加了发行的群面,我只能说群面这种东西就应该立刻马上被逐出地球,太痛苦了😖&nbsp;一面主要是考了一些游戏的理解和对用户的理解吧,加上一些改动方案什么的,一面的面试官很友善,加上我已经有很多面试经验了,那天我表达自己的思路就更顺畅一点。而且面我的组是fps相关的,不跟我聊大众一点的fps,一上来就聊一个挺小众的fps游戏,我有点吃惊,还好应对的还行。二面考察的大致还是一面考察的内容吧,思路还是一致的,聊的游戏和内容变了而已。大概面了25分钟就结束了,我猜测是复核面。从发行的群面开始我就发现,如果面试官真喜欢你你的结果应该是很快出来的,三场面试都是在面完很快就收到了下一场的邀请。而策划的那两轮面试,应该是我的排序很低(毕竟不对口➕我的表现像🐶💩),所以进度推的很慢。硬控我的简历大半个月😄目前感觉下来腾讯的面试官都很友善且专业,能在短时间内看透你的能力和游戏理解边界,都是高手。所以最好不要编造自己的简历和游戏经历,简单几个追问就露馅。简单记录一下在参加藤子的暑期实习招聘过程,希望17号那天有个好结果😇🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧4.17更新:制作人面我表现很糟糕,在问我跟商业化有关的问题,我这方面知识薄弱,面完想死了😇但是面完我看状态是推进到hr面了,不知道出于什么原因。4.18更新:早上约我下午hr面,最后一战!hr面完了,希望有个好的结果吧4.21更新:终于录用评估了,许愿ocoffer来odfer来offer四面八方来 #实习面试初体验#&nbsp;&nbsp;#实习进度记录#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务