HashSet

来源:互联网 发布:acl拆分盘源码 编辑:程序博客网 时间:2024/06/04 18:29

HashSet

Collection

|--List:有序(存的顺序和取的顺序一致。),元素可以重复,元素都有索引。

|--ArrayList:

|--LinkedList:

|--Set:无序不可以重复元素。Set接口的方法和Collection中的方法一致。

Set接口取出元素的方法只有迭代器。

|--HashSet:底层数据结构是哈希表。哈希表这种结构,其实就是对哈希值的存储。

而且每一个对象都有自己的哈希值。因为Object类中的有一个方法 hashCode方法。

如何保证元素唯一性的呢?

通过判断元素的hashCode方法,和equals方法完成的。

hashCode值相同是,会在判断一次euqals方法的返回只是是否为 true

如果hashCode值不相同,就确定元素的哈希表中的位置,就不用在 判断equals了。

当哈希表中有一个桶结构。每一个桶都有一个哈希值,当哈希值相同, 但是equalsfalse是,

这些元素都存放一个桶里。

|--TreeSet:可以对Set集合中的元素进行排序。

数据结构是二叉树数据结构。这种结构,可以提高排序性能。

它又是如何保证元素唯一性的呢?

是根据比较方法的返回值确定的。只要返回的是0.就代表元素重复。

 

HashSet集合是如何保证元素唯一性的?

 

HashSet集合保证元素唯一性,依赖的是元素的hashCode方法和euqals方法。

当元素的哈希值不同时,元素都有自己的独立位置。不需要在判断元素的equals方法,

当元素的哈希值相同时,这时元素在哈希表中位置相同,这时就需要在判断一次元素的内容是否相同。

就需要调用元素的equals方法进行一次比较。如果equals返回是true。那么视为两个元素为重复元素。

只储存一个。

如果返回是false,那么这两个元素不是重复元素,会存储在同一个哈希值上。

 

为了建立自定义对象判断元素是否重复的依据。

需要覆盖hashCode方法,和equals方法。

而且最好依据对象的特有条件来建立hashcodeeuqals的实现。

 

ArrayList:判断包含,以及删除,都是依据元素的equals方法。

 

HashSet:判断包含,以及删除,都是依据元素的hashCode方法。当hashCode值相同时,在判断一次equals方法。

TreeSet排序方式有两种。

1,让元素自身具备比较性。

其实是让元素实现Comparable接口,覆盖compareTo方法。

这称为元素的自然排序。

 

2,当元素自身不具备比较性,或者元素具备的比较性不是所需要的,

可以让集合自身具备比较性。

定义一个比较器:

其实就是定义一个类,实现Comparator接口。覆盖compare方法。

Comparator接口的子类对象作为参数传递给TreeSet的构造函数。

 

 

当元素自身具备比较性,同时TreeSet集合也具备比较器,

这时以比较器为主.

 

 

0 0