hashset 源码解析

原创 2012年03月30日 13:39:01

首先看构造函数: 

即 hashset是用hashMap 来实现的,(即底层结构也是链表数组.)  

// 从下面的put函数可知.hashset 用到的是hashMap 的key (因为hashMap不可能有重复的key,即hashSet不会有重复的元素)

 

  private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
    map = new HashMap<E,Object>();
    }

    /**
     * Constructs a new set containing the elements in the specified
     * collection.  The <tt>HashMap</tt> is created with default load factor
     * (0.75) and an initial capacity sufficient to contain the elements in
     * the specified collection.
     *
     * @param c the collection whose elements are to be placed into this set
     * @throws NullPointerException if the specified collection is null
     */
    public HashSet(Collection<? extends E> c) {
   map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
 addAll(c);
    }

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * the specified initial capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    public HashSet(int initialCapacity, float loadFactor) {
 map = new HashMap<E,Object>(initialCapacity, loadFactor);
    }

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * the specified initial capacity and default load factor (0.75).
     *
     * @param      initialCapacity   the initial capacity of the hash table
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero
     */
    public HashSet(int initialCapacity) {
     map = new HashMap<E,Object>(initialCapacity);
    }

    /**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @param      dummy             ignored (distinguishes this
     *             constructor from other int, float constructor.)
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive

 

//遍历iterator

    /**
     * Returns an iterator over the elements in this set.  The elements
     * are returned in no particular order.
     *
     * @return an Iterator over the elements in this set
     * @see ConcurrentModificationException
     */
    public Iterator<E> iterator() {
 return map.keySet().iterator();
    }

     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
 map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }

// 从下面的put函数可知.hashset 用到的是hashMap 的key (因为hashMap不可能有重复的key,即hashSet不会有重复的元素)

 public boolean add(E e) {
  return map.put(e, PRESENT)==null;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

HashSet源码分析(基于JDK8)

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashM...
  • fighterandknight
  • fighterandknight
  • 2017年03月27日 00:16
  • 1193

深入源码分析HashSet

前面我们花了一定的篇幅学习了HashMap的一些底层原理,以及简单了解了HashSet和HashMap两种集合的渊源,现在我们从HashSet源码入手,来学习HashSet更细节的地方...
  • canot
  • canot
  • 2016年04月25日 10:09
  • 1786

HashSet源码解析

因为HashSet底层是通过HashMap实现的,HashSet中的值作为HashMap中的key,value完全相同,所以在理解了HashMap的基础上,HashSet很容易理解 publ...
  • cpf2016
  • cpf2016
  • 2015年01月20日 20:45
  • 202

HashSet源码解析

package java.util; import java.io.InvalidObjectException; /** * This class implements the Set int...
  • gongpulin
  • gongpulin
  • 2016年04月27日 21:34
  • 1511

Java HashSet源码解析

本解析源码来自JDK1.7,HashSet是基于HashMap实现的,方法实现大都直接调用HashMap的方法 实现了Set接口,实际是靠HashMap实现的 不保证遍历时的顺序,不保证集合顺序的不...
  • StubbornAnt
  • StubbornAnt
  • 2016年06月01日 11:19
  • 2854

HashSet<T> 源码解析

支持泛型,基础元素结构: internal struct Slot { internal int hashCode; // Lower 31 bits of hash code, -1 i...
  • nanmudage
  • nanmudage
  • 2017年08月03日 00:03
  • 74

HashSet源码解析(基于JDK1.7)

HashSet 概述 对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素 private transient HashMap map; ...
  • lwl2014100338
  • lwl2014100338
  • 2018年01月09日 19:42
  • 21

HashSet源码解析

原文地址:http://www.cnblogs.com/java-zhao/p/5110953.html 1、对于HashSet需要掌握以下几点 HashSet的创建:HashSet()往...
  • u010942020
  • u010942020
  • 2017年06月22日 17:27
  • 86

JDK之Hashset源码解析

HashSet源码解析
  • wxl1234579
  • wxl1234579
  • 2017年01月17日 16:51
  • 146

HashSet类源码解析

HashSet特点 1.内部通过HashMap实现set的特征,HashMap的key就是集合的元素,value都设置为null 2.几乎就是HashMap 源码如下package java.u...
  • qunxingvip
  • qunxingvip
  • 2016年07月17日 16:17
  • 964
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hashset 源码解析
举报原因:
原因补充:

(最多只允许输入30个字)