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
以前新元素存入数组,老元素挂在新元素的下面
以后,新元素直接挂在老元素下面