目录
一:Set接口介绍
Set接口继承Collection接口,并没有添加新的方法
二:Set接口的特点
类似于数学中集合的概念
●无序,没有索引,只能通过遍历来查找元素
●没有重复的元素
Set接口常用的实现类有HashSet和TreeSet,常用的是HashSet
三:HashSet容器类
HashSet是一个没有重复元素的集合,不保证元素的顺序,并且里面的元素可以是null,HashSet是用hash算法实现的,底层实际上是用HashMap实现的,因此增删改的效率高
3.1哈希算法原理(简单介绍)
将一些数据按照散列函数运算后存在数组里,这里不过多介绍,会在以后的博客中详细的解释Hash算法
代码
import java.util.HashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set<String> set=new HashSet<>();
//添加元素
set.add("a");
set.add("b1");
set.add("c2");
set.add("d");
set.add("a");
//获取元素
System.out.println("----------获取元素----------");
//由于HashSet没有顺序,即没有索引,所以不能用get(int index)来获取元素
for(String str:set){//通过for each来获取,不依赖迭代因子i
System.out.println(str);
}
}
}
无序和没有重复元素就淋漓尽致的显现了出来
四:HashSet的存储分析
HashSet是一个没有重复元素且无序的集合,线程是不安全的,且里面允许存放null
HashSet底层是用HashMap实现的,而HashMap底层使用数组和链表实现的,所以也可以说HashSet底层使用数组和链表实现的
无序
元素在数组(这个数组的默认长度为15)中存放的时候不是有序存放也不是随机存放的,而是通过对元素的哈希值进行运算来决定元素的位置
不重复
当两个元素的哈希值相等时,也就是在数组的同一个位置的时候,会调用元素的equals()方法来判断两个元素是否相同。如果元素相同则不会添加该元素,如果不相同,则会使用单向链表来保存该元素
图解
6 17 19 22 24 28 39
五:HashSet存储自定义对象
剩下的都是generate自动生成的
两个相同数据的hashcode相同,说明在Users类中没有重写hashcoded()方法和equals()方法
下面是重写后的
快捷键都可以自动生成