• 源码分析五(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集合。

  • 相关阅读:
    Spring aop 记录操作日志 Aspect 自定义注解
    winSCP连接FTP没有上传的权限
    Ubantu下安装FTP服务器
    设置ubantu的软件源地址
    Ubantu中安装sublime
    Ubantu 新建用户后没有生成对应文件夹
    Spring aop 记录操作日志 Aspect
    Java中如何获取spring中配置文件.properties中属性值
    java中获取ServletContext常见方法
    解决:“java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut myMethod”问题!
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6055744.html
Copyright © 2020-2023  润新知