Set接口(本质是Map接口,底层实现在Map里看):不允许元素重复
两个子类:
-
HashSet(HashMap):jdk1.8之后的底层实现是哈希表+红黑树,1.8之前只有哈希表
-
哈希表:一个数组,每个数组元素后面又跟着链表。
-
HashSet使用equals和hashCode共同来判断元素是否重复。
-
equals:判断两个对象的属性是否相同
-
hashCode:对象在内存中的地址根据Hash算法转为int
-
无序存储
-
允许存放null,null也不允许重复
-
equals和hashCode的关系:
- 两个对象的equals相同,则hashCode一定相同
- 两个对象的hashCode相同,equals不一定相同(因为算法不一定相同)
//算法1 //给x = 10 hash(int x){ return x+1; } //算法2 //给y = 20 hash(int y){ return y-9; } //两个hash算法的返回值是相同的,但是x和y实际上是不同的。
-
-
TreeSet(TreeMap):
- TreeSet通过比较接口的返回值来判断两个元素是否重复
- 不允许存放null,底层实现:红黑树
- 有序存储(升序)
- 自定义类要想使用TreeSet,前提是要么自定义类自己实现了Comparable,要么从外部传入一个该类的比价器对象(实现了Comparator接口)
- 如何保证升序?
序:排序
实现排序的接口:
-
java.long.Comparable:内部排序接口
自定义类实现了Comparable接口表示此类具有可比较的性质 。
int compareTo(T o):
返回值>0:大于目标对象
返回值=0:等于目标对象
返回值<0:小于目标对象 -
java.util.Comparator:外部排序接口----策略模式:对原来的代码没有修改(推荐使用)
有一个类本身不具备可比较性,所以专门有另一个类(比较器)实现Comparator接口来比较定义类的大小。
int Compare(T o1,T o2):返回值一样