集合和映射表

集合(set)是一个用于存储和处理无重复元素的高效数据结构。映射表(map)类似于目录,提供了使用键值对快速查询和获取值低功能。

可以使用集合的三个具体类HashSet,LinkedHashSet,TreeSet来创建集合(Set)。

映射表mysql 映射表英文_线性表

HashSet

HashSet类是一个实现类Set接口的具体类,可以用它的无参构造方法来创建空的散列集,也可以由一个现成的合集创建散列集。默认情况下,初始容量是16,负载系数是0.75。负载系数测量集合允许多满,当元素个数超过了容量与负载系数的乘积,容量就会自动翻倍。通常情况下,默认的负载系数是0.75,它是在时间开销和空间开销上的一个很好的权衡。

HashSet类可以用来存储互不相同的元素。考虑到效率因素,添加到散列集的对象必须以一种正确分散散列码的方式来实现hashCode方法。若两个对象相等,那么这两个对象的散列码必须一样。Java API的大多数类都实现了hashCode方法。例如Integer类中的hashCode方法返回它的int值,Character类中的hashCode方法返回这个字符的统一码,String类中的hashCode返回\(\sum s_{i} * 31^{n-1-i}\),其中\(s_i\)是s.charAt(i)。

LinkedHashSet

LinkedHashSet用一个链表实现来扩展HashSet类,它支持对集合内元素的排序,HashSet中的元素是没有被排序的,而LinkedHashSet中的元素可以按照它们插入集合的顺序提取。

如果不需要维护元素被插入的顺序,就应该使用HashSet,它比LinkedHashSet更高效。

TreeSet

TreeSet实现了SortedSet接口。只要对象是可以互相比较大,就可以将它们添加到一个TreeSet中。

比较集合和线性表的性能

线性表的元素可以通过索引来访问。而集合不支持索引,因为集合中的元素是无序的。要遍历集合中的所有元素,使用foreach循环。

映射表

映射表是一种按照键-值对存储元素的容器。它提供了通过键快速获取,删除和更新键-值对的功能。映射表将键和值一起保存。

可以使用Map接口的三个具体的类来创建映射表:HashMap,LinkedHashMap和TreeMap。

映射表mysql 映射表英文_数据结构_02

Map接口提供类查询,更新和获取合集的值和键的方法:

映射表mysql 映射表英文_映射表mysql_03

其中方法entrySet()返回一个所有条目的集合,这些条目是Map.Entry<K, V>接口的实例,这里Entry是Map接口的一个内部接口。

映射表mysql 映射表英文_线性表_04

HashMap,LinkedHashMap和TreeMap类是Map接口的三个具体实现:

映射表mysql 映射表英文_映射表mysql_05

对于定义一个值,插入或删除一个条目而言,HashMap类是高效的。

LinkedHashMap类用链表实现来扩展HashMap类,它支持映射表中的条目排序,可以对条目按元素最后一次被访问的时间从早到晚排序的。

TreeMap类在遍历排好序的键时是最高效的。

单元素与不可变的合集和映射表

Collections类包含了用于线性表和合集的静态方法。它还包含用于创建不可修改的单元素集合,线性表和映射表的方法,以及用于创建只读集合,线性表和映射表的方法。Collections类中还定义了三个常量:EMPTY_SET(空集合),EMPTY_LIST(空线性表),EMPTY_MAP(空映射表)。

映射表mysql 映射表英文_映射表mysql_06