HashSet
Collection
|--List:有序(存的顺序和取的顺序一致。),元素可以重复,元素都有索引。
|--ArrayList:
|--LinkedList:
|--Set:无序,不可以重复元素。Set接口的方法和Collection中的方法一致。
Set接口取出元素的方法只有迭代器。
|--HashSet:底层数据结构是哈希表。哈希表这种结构,其实就是对哈希值的存储。
而且每一个对象都有自己的哈希值。因为Object类中的有一个方法 hashCode方法。
如何保证元素唯一性的呢?
通过判断元素的hashCode方法,和equals方法完成的。
当hashCode值相同是,会在判断一次euqals方法的返回只是是否为 true。
如果hashCode值不相同,就确定元素的哈希表中的位置,就不用在 判断equals了。
当哈希表中有一个桶结构。每一个桶都有一个哈希值,当哈希值相同, 但是equals为false是,
这些元素都存放一个桶里。
|--TreeSet:可以对Set集合中的元素进行排序。
数据结构是二叉树数据结构。这种结构,可以提高排序性能。
它又是如何保证元素唯一性的呢?
是根据比较方法的返回值确定的。只要返回的是0.就代表元素重复。
HashSet集合是如何保证元素唯一性的?
HashSet集合保证元素唯一性,依赖的是元素的hashCode方法和euqals方法。
当元素的哈希值不同时,元素都有自己的独立位置。不需要在判断元素的equals方法,
当元素的哈希值相同时,这时元素在哈希表中位置相同,这时就需要在判断一次元素的内容是否相同。
就需要调用元素的equals方法进行一次比较。如果equals返回是true。那么视为两个元素为重复元素。
只储存一个。
如果返回是false,那么这两个元素不是重复元素,会存储在同一个哈希值上。
为了建立自定义对象判断元素是否重复的依据。
需要覆盖hashCode方法,和equals方法。
而且最好依据对象的特有条件来建立hashcode和euqals的实现。
ArrayList:判断包含,以及删除,都是依据元素的equals方法。
HashSet:判断包含,以及删除,都是依据元素的hashCode方法。当hashCode值相同时,在判断一次equals方法。
TreeSet排序方式有两种。
1,让元素自身具备比较性。
其实是让元素实现Comparable接口,覆盖compareTo方法。
这称为元素的自然排序。
2,当元素自身不具备比较性,或者元素具备的比较性不是所需要的,
可以让集合自身具备比较性。
定义一个比较器:
其实就是定义一个类,实现Comparator接口。覆盖compare方法。
将Comparator接口的子类对象作为参数传递给TreeSet的构造函数。
当元素自身具备比较性,同时TreeSet集合也具备比较器,
这时以比较器为主.