集合之Set【HashSet】
package com.Lucky;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.function.Consumer;
/**
* Set集合: 无序/不可重复/没有索引
*
* HashSet:
* 底层采用【哈希表】存储结构
* JDK8之前:哈希表由数组+链表组成
* JDK8之后:哈希表由数组+链表+红黑树组成
*
*/
/**
* 哈希值:
* 1.对象的整数形式
* 没有重写hashCode方法,不同对象计算的哈希值也是不同的
* 重写了hashCode方法,但是不同对象的属性值相同,计算出来的哈希值也是一样的
* 注意点:哈希碰撞
*/
public class HashSetDemo {
public static void main(String[] args) {
//创建Set集合
Set<String> set1=new HashSet<>();
set1.add("唯易人生"); //返回的结果是booleam类型
set1.add("YYDS");
set1.add("什么鬼???");
set1.add("什么鬼???"); //false 重复的数据无法添加
//遍历获取数据
/*
1.迭代器遍历
*/
System.out.println("-------- 1.迭代器遍历--------------");
Iterator<String> it = set1.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
/*
2.增强for循环遍历
*/
System.out.println("---------2.增强for循环遍历---------------");
for (String s : set1) {
System.out.println(s);
}
/*
3.lamda表达式遍历
*/
System.out.println("---------3.lamda表达式遍历---------------");
//匿名内部类重写
set1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//lamda表达式
set1.forEach(str->System.out.println(str));
//////////////////////////////////////////////////////////////////
System.out.println("****************** hashSet ************************");
//创建TestDemo对象
TestDemo Demo1=new TestDemo("唯易人生",22);
TestDemo Demo2=new TestDemo("唯易人生",22);
//此时已经重写了hashCode方法
System.out.println(Demo1.hashCode()); //计算出来的哈希值一样
System.out.println(Demo2.hashCode());
//特殊情况【哈希碰撞】
System.out.println("---------【哈希碰撞】-----------");
System.out.println("abc".hashCode());
System.out.println("acD".hashCode());
int index=(10-1) & 80;
System.out.println(index);
}
}
底层数据结构分析:

链表结构:

红黑树结构:


浙公网安备 33010602011771号