1.无序:存取顺序不一样
2.不重复:可以去除重复
3.无索引:没有带索引的方法,所以不能使用普通for需变换遍历,也不能通过索引
多种遍历方式
//1.创建一个Set集合的对象
Set<String>s=new HashSet<>();
//2.添加元素
s.add("a");
s.add("b");
s.add("c");
//遍历
//1.迭代器
Iterator<String>it=s.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println();
//2.增加for
for(String it1:s){
System.out.print(it1+" ");
}
System.out.println();
//3.Lambda
s.forEach(it2->System.out.print(it2+" "));
System.out.println();
Set集合的实现类特点
HashSet: 无序,不重复,无索引
LinkedHashSet: 有序,不重复,无索引
TreeSet: 可排序,不重复,无索引
HashSet底层原理:
hashSet集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据性能比较好的结构
哈希值
1.如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
2.如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样大的
3.但是小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样
JDK8以前的底层原理
1.创建一个默认长度16,默认加载·因为0.75的数组,数组名为table
2.根据元素的哈希值跟数组的长度计算出应存入的位置 int index= (数组长度-1)&哈希值
3.判断当前位置是否为null,如果是null直接存入
4.如果位置不为null,表示有元素,则调用equals方法比较属性值 如果集合中存储的是自定义对象,必须重写hashCode和equals
5.一样:不存 不一样:存入数组,形成链表
JDK8以后和以前的区别在于5
以前新元素存入数组,老元素挂在新元素的下面
以后,新元素直接挂在老元素下面
454

被折叠的 条评论
为什么被折叠?



