1.1 HashSet集合介绍
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的 ( 即存取顺序 不一致) 。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持,由于我们暂时还未学习,先做了 解。 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于: hashCode 与 equals 方法。1.2HashSet集合存储数据的结构(哈希表)
什么是哈希表呢? 在 JDK1.8 之前,哈希表底层采用数组 + 链表实现,即使用链表处理冲突,同一 hash 值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即 hash 值相等的元素较多时,通过 key 值依次查找的效率较低。而 JDK1.8 中,哈 希表存储采用数组+ 链表 + 红黑树实现,当链表长度超过阈值( 8 )时,将链表转换为红黑树,这样大大减少了查找 时间。 哈希表是由数组 + 链表 + 红黑树( JDK1.8 增加了红黑树部分)实现的 总而言之, JDK1.8 引入红黑树大程度优化了 HashMap 的性能,那么对于我们来讲保证 HashSet 集合元素的唯一, 其实就是根据对象的 hashCode 和 equals 方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一, 就必须复写 hashCode 和 equals 方法建立属于当前对象的比较方式。1.3HashSet存储自定义类型元素
给 HashSet 中存放自定义类型元素时,需要重写对象中的 hashCode 和 equals 方法,建立自己的比较方式,才能保 证 HashSet 集合中的对象唯一1.4LinkedHashSet
我们知道 HashSet 保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢? 在 HashSet 下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class Test222 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
输出