zoukankan      html  css  js  c++  java
  • 源码分析五(HashSet的内部实现)

    一:首先来看看Hashset的继承体系

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

    继承AbstractSet类,实现Set接口

    set接口继承Collection接口,所以可以迭代,集合的方法它都有,下面来看一下set接口:

    public interface Set<E> extends Collection<E> {
        // 集合中元素数量
        int size();
    
        // 判断集合是否为空
        boolean isEmpty();
    
        //判断是否包含指定元素
        boolean contains(Object o);
    
        //调用该方法可以产生迭代器,这个方法继承自Iterable接口
        Iterator<E> iterator();
    
        //将集合转换为数组,这个方法时集合和数组之间的桥梁
        Object[] toArray();
    
        //将集合转换为指定类型的数组
        <T> T[] toArray(T[] a);
    
    
       //向集合中添加元素
        boolean add(E e);
    
    
        //删除集合中的指定元素
        boolean remove(Object o);
    
    
        //判断是否包含指定集合中的所有元素
        boolean containsAll(Collection<?> c);
    
        //将指定集合中的元素添加到集合中
        boolean addAll(Collection<? extends E> c);
    
        //保留指定集合中的所有元素,就是集合中其他的元素删除
        boolean retainAll(Collection<?> c);
    
        //删除指定集合中的所有元素
        boolean removeAll(Collection<?> c);
    
        //清空集合中所有元素
        void clear();
    }
    

    集合HashSet元素不可以重复,而且是有序的,因为它的底层维护了HashMap类的key值

        private transient HashMap<E,Object> map;
    
        private static final Object PRESENT = new Object();  
    
         
        public HashSet() {
    	map = new HashMap<E,Object>();
        }
    

    当使用构造器new一个HashSet的对象时,实际上创建了一个HashMap对象。

    二:再来看看HashSet类中的方法:

    //迭代HashSet中的元素,实际上是迭代HashMap的key值
    public Iterator<E> iterator() {
    	return map.keySet().iterator();
        }
    
    //HashSet集合中元素size就是map集合中元素数量
     public int size() {
    	return map.size();
        }
    

      

    //判断是否为空,也是判断map是否为空
    public boolean isEmpty() {
    	return map.isEmpty();
        }
    

      

    //判断Hashset集合是否包含指定元素就是判断map中是否包含指定的key值
     public boolean contains(Object o) {
    	return map.containsKey(o);
        }
    

      

    //向集合中添加元素就是向map中put元素,key就是元素,value是一个常量值
     public boolean add(E e) {
    	return map.put(e, PRESENT)==null;
        }
    
    private static final Object PRESENT = new Object();
    

      

    //移除指定元素,就是删除map中的key-value映射
    public boolean remove(Object o) {
    	return map.remove(o)==PRESENT;
        }
    

     

    //清空HashSet集合中元素就是清空map集合
     public void clear() {
    	map.clear();
        }
    

    三:总结

    其实HashSet类的用法很简单,底层实现就是维护一个Hashmap,Hashset类的元素维护在Hashmap的key位置上,

    value是一个常量值,因为Hashmap的key是不可重复的,有序的,所以Hashset也具有这样的特性,在涉及到排序

    或者去重等问题时,可以考虑使用Hashset集合。

  • 相关阅读:
    this is a test from windows live writer 11529
    RoR部署方案深度剖析 (转载自javaeye)
    Rails每周一题(六): Security Guide(上) (转载)
    让你大脑变冷静的28句英文
    REST on Rails之自定义路由
    REST on Rails之资源嵌套
    #### 高薪 ##招聘:。。。。。 待遇非常不错。
    JavaEye网站的RoR性能优化经验谈 (转载)
    网页打印的分页问题
    Ruby Metaclass详解
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6055744.html
Copyright © 2011-2022 走看看