C++和Java HashMap,HashSet

    上次跟一阿里的前辈交流,他问我对Java的HashMap熟不熟悉,我很汗颜,告诉他我一直都在用C++的stl。他又接着问我C++的HashMap是用什么数据结构实现的?我想了半天,STL里面map和multiMap我倒是经常用,HashMap没用过,不是特别肯定的告诉他是“红黑树”。

    今天突然想起,上网搜了一下,原来标准std中并没有实现HashMap,gnu c++提供了hash_map。标准std中的Map确实是基于红黑树,添加和删除都是O(log(n));gnu的hash_map查找和添加复杂 度均为O(1)。Java中的HashMap是基于数组和链地址法实现,添加和删除复杂度也O(1)。

    Java HashSet也是中Hash结构,底层是基于HashMap实现。

    HashSet派生自AbstractSet,实现了Set接口。它有两个私有成员:

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    其中map就是set的底层实现,但只用到了map中的key,map中的value就是这个PRESENT。

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

    还有一点需要注意的是,HashSet底层也可以基于LinkedHashMap实现:

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

    

    

你可能感兴趣的:(map,HashMap,hashset)