HashSet和HashMap的关系

HashSet和HashMap有关系吗?初学者遇到这种问题,应该会直接否定:放尔oo的xx(当年我就是这么对待一位前辈的).如果如果是那种大牛,肯定会轻蔑的一笑:这种渣渣般的问题还需要问吗?你是白痴吗?
HashSet和HashMapyou关系吗?有,而且还是那种跟做头发差不多的.
大家不妨来看一下HashSet的源码:

//基于HashMap实现,底层使用HashMap保存所有元素    
private transient HashMap<E,Object> map;
//定义一个Object对象作为HashMap的value    
private static final Object PRESENT = new Object();

//调用默认的HashMap构造方法初始化map 
   public HashSet() {
       map = new HashMap<>();
    }
//根据给定的Collection参数调用HashMap(int initialCapacity)的构造方法创建一个HashMap(这个构造方法的HashMap的源码分析里已经描述过了)  
// 调用addAll方法将c中的元素添加到HashSet对象中  
    public HashSet(Collection<? extends E> c) {
       map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
//构造一个指定初始化容量和负载因子的HashMap 
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
// 构造方法四:构造一个指定初始化容量的HashMap  
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
}
1.  //构造一个指定初始化容量和负载因子的LinkedHashMap  
2.  // dummy参数被忽略,只是用于区分其他的,包含一个int、float参数的构造方法 
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

不卖关子,从源码上来看,一句话:HashSet实际上为(key,null)类型的HashMap,而我们知道,HashSet的key是不能重复的,所以HashSet的值自然也是没有重复的.因为HashMap的key可以为null,所以HashSet的值可以为null.最后看个小案例:

public class HashSetDemo {
    public static void main(String[] args) {
        HashSet<String> hs = new HashSet<String>();
        hs.add(null);
        for (String string : hs) {
            System.out.println(string);
        }
    }
}

运行结果
这里写图片描述

当然,HashSet在存储对象等数据时,为了去重,一般都会重写hashCode()和equals().关于这两个方法不想多说,只说两点:

1..equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。

2.. hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。

猜你喜欢

转载自blog.csdn.net/bushanyantanzhe/article/details/79210920