Set注重独一无二的性质,用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
一、HashSet(Hash表)
哈希表存储的是哈希值。HashSet存储元素的顺序并不是按照存入的顺序,而是按照哈希值来存的,所以取数据也是按照哈希值来取的。元素的哈希值是通过元素的hashcode方法来获取的,HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果equals结果为true,HashSet就视为同一个元素,如果为false就不是同一个元素;
哈希值相同equals为false的元素时怎么存储呢?就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中),也就是哈希一样的存一列:
hashCode值不同的情况下:
hashCode值相同但equals不相同的情况:
HashSet通过hashCode值来确定元素在内存中的位置,一个hashCode位置上可以存放多个元素。
二、TreeSet(二叉树)
1、TreeSet是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入二叉树指定的位置;
2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆盖相应的compare()函数,才可以正常使用;
3、在覆盖compare函数时,要返回相应的值才能使TreeSet按照一定的规则来排序;
4、比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
三、LinkHashSet(HashSet+LinkedHashMap)
LinkHashSet的特点:保证怎么存怎么取,底层是哈希表+链表,保证了元素有序
网友评论