散列集(HashSet)、映射

来源:互联网 发布:ssh连接阿里云服务器 编辑:程序博客网 时间:2024/06/16 06:22

 一、散列集

 链表和数组可以按照人们的意愿排列元素的顺序。但是在查找所需元素,又不知道其位置时,就需要遍历整个集合。而当集合中元素很多时,就会消耗很多时间。如果不在意元素的顺序,就有几种可以快速查找所需元素的数据结构,缺点就是无法控制元素出现的次序。但是能保证按照有利于操作结果的原则组织数据。散列表(HashTable)就是其中一种

  散列表会为每个对象计算一个散列码。具有不同数据域的对象将产生不同的散列码。如果自定义类,就要负责实现合理的hashcode方法,并且与equals匹配。

  在Java中,散列表是有链表数组实现的


每个列表称为一个桶bucket。要想查找元素的位置,先要计算出他的散列码,然后对总的桶数取余,计算的结果就是存放该对象的桶的索引。

如果桶被存满,这种现象称为散列冲突。该新对象就会与桶中的其他元素比较,查看该对象是否已经存在该桶中。如果散列函数合理,散列码合理而且随机分布,桶的数目又足够大,需要比较的次数就会很少。

Java类库中提供的hashSet Map都是基于散列表的。

散列集中的contains方法已经被重写,他根据提供元素的散列码在相应的桶中查找对象是否已经出现该集中。所以,可以看出散列集是如何实现快速查找的。


二、映射

  集是一种快速查找所需元素的集合。但是如果查找某个元素时,是根据这个元素的精确副本。这是一种不太通用的查找方式。映射数据结构为此而设计。

  2种通用的实现 

HashMap:根据键的散列 

TreeMap:用键的整体顺序对元素排序



集合类库不认为映射本身是一种集合(其它数据结构框架认为映射是一个关于键索引的值集合或者是一个键值对的集合)。不过可以得到映射的视同

视图:从原来集合或映射中得到一个实现Collection接口的类对象,通过这个类对象中的方法可以对原集合进行操作

映射视图:Set<K> keySet得到键的集

Collection<V> values()得到值的集合,但不是集

Set<Map.Entry<K,V>> entrySet()得到键值对的集

原创粉丝点击