Set
Set集合是Collection集合的子接口,该集合中不能有重复元素!!
Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法
Set接口,它有两个常用的子实现类HashSet,TreeSet
HashSet
HashSet实现了Set接口,底层是hash表(实际上底层是HashMap) 该类
不允许重复
元素,不保证迭代顺序
,即无序(插入顺序和遍历顺序不一致)
构造方法
HashSet()
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16
,加载因子是 0.75
。
HashSet(Collection<? extends E> c)
构造一个包含指定 collection 中的元素的新 setHashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
方法:
HashSet类中的方法与父接口Set接口中的方法一致,跟Collection接口中方法一致
public static void main(String[] args) {
// 创建HashSet集合
HashSet<Integer> set = new HashSet<>( );
// 放入元素
boolean r1 = set.add(221);
System.out.println(r1 );
boolean r2 = set.add(221);
System.out.println(r2 );
set.add(111);
set.add(111);
set.add(44);
set.add(23);
// 遍历(for + Iterator)
for(Integer i: set) {
System.out.println(i );
}
// 总结: 顺序问题+ 重复问题
// 无序即 插入顺序和迭代顺序不一致
// 不允许重复!
Iterator<Integer> iterator = set.iterator( );
while(iterator.hasNext()) {
Integer integer = iterator.next( );
System.out.println(integer );
}
// 演示其他方法(移除,判断,大小等等)
System.out.println(set.size() );
System.out.println(set.isEmpty( ));
set.clear();
System.out.println(set.size() );
System.out.println(set.isEmpty( ));
HashSet<Integer> set2 = new HashSet<>( );
set2.add(111);
// 移除全部指定元素
System.out.println(set.removeAll(set2));
System.out.println(set );
}
扩容机制:
HashSet底层是Hash表,其实是HashMap. 默认初始容量16,加载因子0.75 ---> 扩容的阈值= 容量 * 因子 = 16 * 0.75 = 12 即超过12个元素时就要触发扩容,扩容成原来的2倍
去重原理
调用add(E e)方法时,会在底层调用元素e的hashcode方法来获得对象的地址值
如果地址值不一样,直接存储
如果地址值一样时,会再调用元素的equals方法判断元素的内容是否一样
如果equals为false,那么存储 但是如果equals判断值为true,那么去重