zoukankan      html  css  js  c++  java
  • HashSet源码分析


    title: HashSet源码解析
    date: 2018-08-09 16:00:26
    tags: java

    1. 引言

    HashSet 实现了 Set 接口,底层的数据结构是一个 哈希表(实际上是一个 HashMap 实例),所以,要了解 HashSet,最主要的还是要了解 HashMap,有关 HashMap 源码分析可以看 这篇文章。HashSet 主要有以下特点:

    • 因为底层的数据结构是 HashMap,所以允许 null 值的存在。
    • 因为底层的 HashMap 会重新构造 hash table 的大小,因此并不能保证迭代的顺序和存储顺序一致。
    • HashSet 所有的元素存在 HashMap 的 key 中,对应的 value 是一个静态变量 private static final Object PRESENT = new Object(),因为 HashMap 中 key 是唯一的,因此 HashSet 不允许存在重复值。
    • 它并不是同步的,JDK 提供了这样的方法可以创建出一个同步的 HashSet:
      Set set = Collections.synchronizedSet(new HashSet())
    • iterator 方法返回的是迭代器是 fail-fast,在创建了迭代器之后如果对该 HashSet 进行修改的话(除非是代用迭代器自己的 remove 方法),将会抛出 ConcurrentModificationException。

    2. 常规操作

    HashSet 的增删改等操作都是调用 hashMap 来完成的,因此不再做过多的分析

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
    
    public int size() {
        return map.size();
    }
    
    public boolean isEmpty() {
        return map.isEmpty();
    }
    
     public boolean add(E e) {
         return map.put(e, PRESENT)==null;
     }
    。。。
    
  • 相关阅读:
    获取指定<文字行数>的<高度>是多少 TextKit
    JS 与 OC 交互
    PHP-note
    MySQL函数
    freeSWITCH之多平台测试通信
    freeSWITCH之安装
    PHP面向对象
    MySQL Optimization 优化原理
    理解常量指针与指针常量?
    InterView之PHP(2)
  • 原文地址:https://www.cnblogs.com/firepation/p/9449944.html
Copyright © 2011-2022 走看看