HashSet虽然实现的是Set - Collection接口,但其源码是通过new HashMap()实现的,底层数据结构是哈希表,存取都比较快,线程不安全。
特点:
1. 无序集合,不保证存储元素的顺序,没有索引
2. 不能存储重复元素
3. 可以存储Null
存取基本操作,Iterator的获取跟ArrayList一样:
HashSet<String> hashSet = new HashSet<>();
hashSet.add("asf");
hashSet.add("bnk");
hashSet.add("lsk");
hashSet.add("owie");
System.out.println(hashSet);
Iterator<String> it = hashSet.iterator();
while (it.hasNext()) {
String ele = (String) it.next();
System.out.println(ele);
}
System.out.println("---------------------------");
for (String ele : hashSet) {
System.out.println(ele);
}
查看HashSet源码,其操作底层都是通过调用HashMap方法实现的,HashSet会将元素存储在HashMap的key集合中,然后为value赋一个static空对象PRESENT。
HashSet不能存储重复元素,因为HashMap的key集合不可以重复,本质也是通过equals()和hashCode()来判定两个对象是否重复,因此将对象存储在HashSet之前,必须先重写对象的equals()和hashCode()方法。
hashCode原则:
两个对象的hashCode()相等,equals()未必返回true
两个对象equals()返回true,它们的hashCode()一定相等
HashMap中,只有两个对象hashCode()相等,且equals()相同,才判定为重复元素,重写对象的equals()方法一定要同时重写hashCode()以符合原则。