HashSet与HashMap、Hashtable

(最近在老师叫我们用java去实现LRU算法,了解到要用双链表去做,要用到LinkHashMap去做,但自己对java的几大集合框架并不熟悉,在学习过程了解到了HashMap和HashSet,做个简单笔记吧)

HashMap

HashMap是一个有序的集合,是有一对属性值的集合,属性包含key,和value。关键字key是唯一不重复的,查询起来速度很快。

 

HashMap 的实例有两个参数影响其性能:初始容量 和 加载因子。容量是 哈希表中桶的数量,,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。  通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

HashSet

 

而HashSet(散列表)就像是把HashMap中value去掉,说白了就是只有一个key的HashMap集合。它实现了Set接口,意味着它的元素不能有重复值出现。HashSet中有add、remove、contains 和 size方法,没有get()方法,但可以通过iterator()来实现,迭代所需的时间与 HashSet 实例的大小(元素的数量)成比例。且对于 HashSet 而言,它是基于 HashMap 实现的。

下面是HashSet的源代码:

public class HashSet<E> extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {HashMap<E,Object> map;Object PRESENT = new Object();… HashSet(){map = new HashMap<E,Object>();}// 以指定的 initialCapacity、loadFactor 创建 HashSetHashSet(int initialCapacity, float loadFactor){map = new HashMap<E,Object>(initialCapacity, loadFactor);}public HashSet(int initialCapacity){map = new HashMap<E,Object>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy){map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);}Iterator<E> iterator(){return map.keySet().iterator();} size(){return map.size();}// 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空, isEmpty(){return map.isEmpty();}// 调用 HashMap 的 containsKey 判断是否包含指定 key contains(Object o){return map.containsKey(o);} add(E e){return map.put(e, PRESENT) == null;} remove(Object o){return map.remove(o)==PRESENT;} clear(){map.clear();}… }真正的寂寞是在人群中,当你面对许多熟悉的脸,

HashSet与HashMap、Hashtable

相关文章:

你感兴趣的文章:

标签云: