1.Set接口是Collection接口的子接口,用于存储无序且不可重复的数据。其主要实现类是HashSet,另有LinkedHashSet、TreeSet等。
2.Set的无序性:Set在存储数据时是无序的,这种无序是指内存层面的无序(但不是随机),它并不是在开辟好的内存空间里依次顺序存入数据,而是根据特定的规则存储到特定位置。
3.Set的不可重复性:Set在添加数据时会首先调用重写过的equals()进行判定,若为true则不添加,从而确保相同的元素只有一个
4.HashSet:
(1)HashSet的底层是数组+链表,数组中的每个元素是一个链表的第一个元素。在存储数据时,是使用哈希值+散列函数来决定数据存储的位置,因此其存储是无序的,并且不可重复。一个数据首先被添加时,首先调用hashCode()方法计算其哈希值,然后利用散列函数计算出它应该存储在数组的哪一个位置,之后进行判断:
1)若此位置无数据,则直接存入;
2)若此位置已经存储了一个或多个数据,则遍历对比他们的哈希值是否一致。若哈希值不相同则存入;若相同则再调用被存入数据的所属类的equals()方法,如果返回结果为true则不存入,为false则存入
(2)由于在HashSet中,添加数据需要依赖hashCode()方法和equals()方法来判断其存储位置,因此要求向HashSet中添加的数据,其所属类必须重写过hashCode()方法和equals()方法。因为没有重写过的hashCode()方法,会把被添加的数据的地址值也纳入计算,由此导致同样的数据会有不同的哈希值。
5.TreeSet:TreeSet中只能存储同类的数据,不能存放相同的数据。TreeSet中添加的数据会被按照其所属类的属性进行排序,排序又分为自然排序和定制排序。在自然排序中,是通过CompareTo()方法进行的,所以对于自定义类,需要重写CompareTo()方法,以便TreeSet完成排序,否则会报错。