一、特征
1.底层实现是HashMap的 key
2.默认初始化容量是16。默认的加载因子是0.75
3.当村存储的数据到达原容量的0.75时,扩容为原容量的2倍
4.不保证顺序、唯一、可以为null、无索引
5.查找较慢、插入删除较快
6.线程不同步的,多线程使用不安全
如果要实现同步
Set set = Collections.synchronizedSet(new HashSet(…));
二、常用方法
1.add(E e)
2.size()
3.remove(Object o)
4.clear()
5.isEmpty()
6.contains()
7.iterator()
三、注意事项
1.HashSet按照什么逻辑排序
1.不保证顺序,存入的顺序和实际元素排列顺序无关
2.获取元素时的前后顺序由Map中的hash()方法得到的混淆后的hash值决定
2.HashSet扩容是否有上限
HashMap限定了最大容量:MAXIMUM_CAPACITY = 1 << 30;
四、测试代码
public class Demo05HashSet {
@Test
public void test1(){
HashSet<String> set1 = new HashSet<>();
set1.add("王子玉");
set1.add("吴青山");
set1.add("钟雪");
set1.add("任玉文");
System.out.println(set1);
HashSet<Integer> set2 = new HashSet<>();
set2.add(123);
set2.add(88);
set2.add(99);
set2.add(55);
System.out.println(set2);
set1.clear();
System.out.println(set1.isEmpty());
System.out.println(set1);
System.out.println(set2.contains(123));
Iterator<Integer> iterator = set2.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
for (Integer i : set2) {
System.out.println(i);
}
}
@Test
public void test2(){
HashSet<String> set = new HashSet<>();
set.add("hello");
set.add("hiiiiiii");
set.add("tomooooooooooo");
set.add("raky");
System.out.println(set);
HashSet<Integer> set2 = new HashSet<>();
set2.add(5);
set2.add(1);
set2.add(90);
set2.add(8);
set2.add(33);
set2.add(8);
System.out.println(set2);
}
@Test
public void test3(){
String key1 = "Tom";
int h1;
int i1 = (h1 = key1.hashCode()) ^ (h1 >>> 16);
System.out.println(i1);
String key2 = "Hello";
int h2;
int i2 = (h2 = key2.hashCode()) ^ (h2 >>> 16);
System.out.println(i2);
}
}