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集合。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6055744.html
Copyright © 2011-2022 走看看