一个庸俗的实现:HashSet

原创 2004年09月21日 19:16:00

我们知道HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图,因为HashSet直接利用HashMap,所以实现非常简单,这个类其实就是一个使用HashMap的例子,
根本就没有什么值得分析的。
由于不用使用HashMap的value集合,所以所有的value都是同一个值(一个没有用的对象,但是不是null),这里之所以不为null是有道理的。如果用null的话,add和remove方法可能会有问题,因为HashMap的put和remove方法如果返回
null,我们无法判断是否增加了或者删除了(不存在返回null,存在返回value值)。

有关HashMap:http://blog.csdn.net/treeroot/archive/2004/09/20/111104.aspx
HashSet的声明如下:
public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable
有关AbstractSet:http://blog.csdn.net/treeroot/archive/2004/09/21/112219.aspx
有关Set: http://blog.csdn.net/treeroot/archive/2004/09/18/109065.aspx
有关Cloneable:http://blog.csdn.net/treeroot/archive/2004/09/07/96936.aspx

static firialVersionUID = -5024744406713321676L;

private transient HashMap map;//HashSet直接引用了一个HashMap

private static final Object PRESENT = new Object();
//作为HashMap的value值,没有任何用处。

public HashSet() {
  map = new HashMap();
}

public HashSet(Collection c) {
  map = new HashMap(Math.max((int) (c.size()/.75f) + 1, 16));
  addAll(c);
}

public HashSet(int initialCapacity, float loadFactor) {
  map = new HashMap(initialCapacity, loadFactor);
}

public HashSet(int initialCapacity) {
  map = new HashMap(initialCapacity);
}

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  map = new LinkedHashMap(initialCapacity, loadFactor);
}

public Iterator iterator() {
  return map.keySet().iterator();
}

public int size() {
  return map.size();
}

public boolean isEmpty() {
  return map.isEmpty();
}

public boolean contains(Object o) {
  return map.containsKey(o);
}

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

public boolean remove(Object o) {
  return map.remove(o)==PRESENT;
}

public void clear() {
  map.clear();
}

public Object clone() {
  try {
    HashSet newSet = (HashSet)super.clone();
    newSet.map = (HashMap)map.clone();
    return newSet;
  } catch (CloneNotSupportedException e) {      
    throw new InternalError();
  }
}

private synchronized void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
  s.defaultWriteObject();
   Write out HashMap capacity and load factor
  s.writeInt(map.capacity());
  s.writeFloat(map.loadFactor());
  s.writeInt(map.size());
   for (Iterator i=map.keySet().iterator(); i.hasNext(); )
     s.writeObject(i.next());
}

private synchronized void readObject(java.io.ObjectInputStream s) 
       throws java.io.IOException, ClassNotFoundException {
   s.defaultReadObject();
  int capacity = s.readInt();
  float loadFactor = s.readFloat();
  map = (this instanceof LinkedHashSet ? new LinkedHashMap(capacity, loadFactor) :
                        new HashMap(capacity, loadFactor));
  int size = s.readInt();
  for (int i=0; i<size; i++) {
    Object e = s.readObject();
    map.put(e, PRESENT);
  }
}

Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别

Collections类中提供了多个synchronizedXxx,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题.    正如Java中常用的集合框架推荐使用...
  • u012560902
  • u012560902
  • 2016年07月31日 08:58
  • 1172

HashSet和HashMap的底层实现——哈希表、散列表

java.lang  类 Object java.lang.Object int hashCode()            返回该对象的哈希码值。 boolean equ...
  • lpp1234567
  • lpp1234567
  • 2014年03月07日 12:27
  • 2475

Java HashSet的实现原理详解

HashSet是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashSet的实现原理做一下详细讲解。 (Java1.8源码:http://docs.oracle.com/j...
  • guoweimelon
  • guoweimelon
  • 2016年03月04日 18:49
  • 3356

HashSet底层实现

1.    HashSet概述:    HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用nul...
  • u012092620
  • u012092620
  • 2015年04月27日 17:58
  • 1296

【Java学习笔记】HashSet中加入自定义的类的对象

作者:gnuhpc  出处:http://www.cnblogs.com/gnuhpc/ 这个话题还是从一个有问题的代码中引申出来的,原代码如下: import java.util.*;  c...
  • tywei2012
  • tywei2012
  • 2013年10月31日 20:00
  • 1715

向HashSet插入自定义对象判断是否重复

一.HashSet概述HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。 二.存储方式与...
  • Kindle_code
  • Kindle_code
  • 2016年07月11日 15:43
  • 1641

增加java基础——hashSet中存放对象的比较规则

只有不断找寻机会的人才会及时把握机会。在项目中,用的集合对象大部分是List和Map,但是Set这个对象却比较少用,突然有一天,我想起来,本来想敲个demo的,但是已经忘记里面的存放对象的规则了,那么...
  • Xingege662
  • Xingege662
  • 2016年10月23日 17:20
  • 839

HashSet的实现,与hashMap的关系

1、HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMa...
  • u014033756
  • u014033756
  • 2016年01月28日 12:43
  • 2163

【数据结构】HashSet原理及实现学习总结

在上一篇博文(HashMap原理及实现学习总结)详细总结了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素。所以如果对HashMap比...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年06月03日 17:39
  • 2159

HashSet源码分析(基于JDK8)

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashM...
  • fighterandknight
  • fighterandknight
  • 2017年03月27日 00:16
  • 1187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个庸俗的实现:HashSet
举报原因:
原因补充:

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