1、Set集合的特点
无序,不重复、无索引
Set集合的方法上基本和Collection的API一致
2、Set集合的实现类特点
HashSet:无序、不重复、无索引
LinkedHashList:有序、不重复、无索引
TreeSet:可排序、不重复、无索引
public static void main(String[] args) {
//1、创建一个Set集合的对象
Set<String> s=new HashSet<>();
//2、调用add方法
//如果当前元素是第一次添加,成功返回true;如果是重复添加,添加失败返回false
s.add("张三");
s.add("李四");
s.add("王五");
//3、打印集合
//无序
System.out.println(s);
//迭代器进行遍历
Iterator<String> it=s.iterator();
while (it.hasNext()){
String str=it.next();
System.out.println(str);
}
//增强for遍历
for (String str:s){
System.out.println(str);
}
//Lambda表达式遍历
s.forEach(str-> System.out.println(str));
}
public static void main(String[] args) {
/*
对象的整数类型表示
1、如果没有重写hashCode方法,不同对象计算出的哈希值是不一样的
2、如果已经重写了hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是相同的
3、但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能相同。(哈希碰撞)
*/
//1、创建对象
student s1=new student("zhangsan",23);
student s2=new student("zhangsan",23);
//2、重写hashCode方法
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
//在小部分情况下会发生哈希碰撞
System.out.println("abc".hashCode());
System.out.println("acD".hashCode());
}
1、创建一个默认长度为16,默认加载因为0.75的数组(即当存入的数据达到总长度的75%时,开始扩容),数组名为table
2、根据元素的哈希值跟数组的长度计算出应存入的位置
3、判断当前位置是否为null,如果是null则直接存入
4、如果位置不为null,表示有元素,调用equals方法比较属性值(如果是自定义的对象,需要重写equals和hashCode方法)
5、
一样:不存 不一样:存入数组,形成链表
jdk8以前:新元素存入数组,老元素挂在新元素下面
jdk8以后:新元素直接挂在老元素的下面,当链表的长度超过8,且数组长度大于等于64时,连标自动转化为红黑树。
1、jdk8以前:数组和链表组合而成。
jdk8以后:数组和链表和红黑树组成。
2、
1、先根据地址值或者属性值计算哈希值,利用哈希值寻找到数组存储位置
2、判断是否为null,如果为null,直接存入。如果不是null代表已经存入数据,使用equals方法(如果是自己定义的对象需要重写equals方法),将新元素挂在老元素下面,当满足链表的长度超过8,且数组长度大于等于64时,将链表转化做红黑树。
3、Hash存储时会根据哈希值随机存储,而取出来时会顺着数组的索引进行取值。
4、因为链表有许多元素,不能直接单独分为一组。
5、equals和HashCode方法进行去重判断。
和哈希表一样,但是添加数据的时候才用了双向链表的方式,查询时按照节点顺序进行查询,因此存取有序。