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()不是绝对可靠的。