# Java集合之Set **Repository Path**: fpfgitmy_admin/java-collection-set ## Basic Information - **Project Name**: Java集合之Set - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### Set接口 + jdk7的时候底层用数组创建 + 存储无序的(不等于随机性,在添加元素时候存放的位置是无序的,是根据数组添加的hash值进行排序的) + 不可重复的数据,保证添加的元素按照equals()判断时,不能返回true,即相同的元素只能添加一个(也会根据hashCode方法进行比较) + HashSet:作为Set接口的主要实现类,线程不安全的,可存储null值,底层是数组+链表的方式进行存储 + LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序去遍历(添加的顺序就是遍历的顺序) + TreeSet:使用红黑树数据存储结构,可以按照添加对象的指定属性,进行排序 + Set中没有重新定义的方法,都用的是Collection的方法 ##### Set的添加过程 + HashSet的底层是HashMap + 在HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,次哈希值接着通过某种算法计算出在HashSet底层数据中心存放位置(即为:索引位置),判断数组此位置上是否有元素 + 如果此位置上没有其他元素,则元素a添加成功 --->情况1 + 如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值 + 如果hash值不相同,则元素a添加成功,--->情况2 + 如果hash值相同,进而需要调用元素a所在类的equals方法 + equals()返回true,元素a添加失败, + euqals返回false,则元素添加成功 --->情况3 + 对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储 + 对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object)方法比较相等,别切两个对象的equals()方法返回值也相等,相等的对象必须有相等的散列码(哈希值) + jdk7:元素a放到数组中,指向原来的元素 + jdk8:原来的元素在数组中,指向元素a + 总结:7上8下 + 总结图示 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0428/141417_78ac5746_1942182.png "屏幕截图.png")