HashSet散列集

一.HashSet的意义

  • 链表和数组可以按照人们的意愿排列元素的次序。但是,如果想要查看某个指定的元素,却又忘记了它的位置,就需要访问所有的元素,直到找到为止。如果集合中包含的元素很多,将会消耗很多时间。如果不在意元素的顺序,可以有几种能够快速查找元素的数据结构。其缺点是无法控制元素出现的次序。它们将按照有利于其操作目的的原则组织数据。
  • 有一种众所周知的数据结构,可以快速地查找所需要的对象,这就是散列表。散列表为每个元素计算一个整数,称为散列码。散列码是由对象的实例域产生的一个整数。更加准确的说,具有不同数据域的对象将产生不同的散列码。

二.桶

  • 在java中,散列表用链表数组实现。每个列表被称为桶。每个列表被称为桶。要想查找表中对象位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。
    散列表

  • 例如,如果某个对象的散列码为76268,并且有128个桶,对象应该保存在第108号桶中(76268除以128余108)。或许会很幸运,在这个桶中没有其他元素,此时将元素直接插入到桶中就可以了。当然,有时候会遇到桶被占满的情况,这也是不可避免的。这种现象被称为散列冲突。这时,需要用新对象与桶中的所有对象进行比较,查看这个对象是否已经存在。如果散列码是合理且随机分布的,桶的数目也足够大,需要比较的次数就会很少。

  • 桶数是指用于收集具有相同散列值的桶的数目。如果插入到散列表中的元素太多,就会增加冲突的可能性,降低运行性能。通常,将桶数设置为预计元素个数的75% ~ 150%。桶数设置为一个素数,以防键的集聚。

三.HashSet类

  • Java集合类库提供了一个HashSet类,它实现了基于散列表的集。contains方法已经被重新定义,用来快速地查看是否某个元素已经出现在集中。它只在某个桶中查找元素,而不必查看集合中的所有元素。
  • 散列集迭代器将依次访问所有的桶。由于散列将元素分散在表的各个位置上,所以访问它们的顺序几乎是随机的。只有不关心集合中元素的顺序时才应该使用HashSet。

猜你喜欢

转载自blog.csdn.net/qq_38844728/article/details/88651311