赞
踩
散列表,又叫做哈希表(Hash Table),是能够通过给定的散列码直接访问到具体对应的元素值的一个数据结构。也就是说,把给定的散列码通过散列函数(或者称哈希函数)映射成该散列码在散列表中的一个位置,这个位置存储给定散列码所对应的元素值,以这种方式加快查找速度。
散列码: 是由元素导出来的一个整数值,散列码是没有规律的。
散列函数:它本质就是一个函数,我们把它定义为 hash(key),key 就是元素的散列码,通过 hash函数得到的值就是在表中的散列地址(或者叫做哈希值,散列值),也即是上述的 表中位置标注。
散列冲突:我们时常会碰到两个散列码key1!=key2,但是hash(key1)==hash(key2)的这种 情况,散列码不同,散列地址却一样,这种情况我们叫做散列冲突,并且把key1和 key2称为这个散列函数的同义词。
需要额外的空间:因为散列表实际上是存不满的,在冲突越来越多时,通常会选择进行扩容空间。
一个好的散列函数的设计可以参考两个原则:1.计算简单;2.散列地址分布均匀。
即使设计的再好的散列函数也不可能完全避免散列冲突,所有处理散列冲突的方法诞生:
定义:HashSet是基于HashMap来实现的,所以允许空值,且不是线程安全的(区别就在 于:HashMap中输入一个键值对,而在HashSet中只输入一个值)。HashSet还继承了 AbstractSet 抽象类,实现了Set接口,同时还实现了Cloneable(允许克隆),Serializable (可序列化)。同时它是不允许重复值的,不保证集合的迭代顺序,所以随着时间元素的顺 序可能会改变。
实现:在JDK 7版本中,散列表是采用数组+链表实现。每个链表被称为桶(bucket),当产生了散 列冲突时就可以把冲突的元素存储在链表当中。与JDK 7不同的是, 在JDK 8版本中,是通 过数组+链表+红黑树实现。当某个桶(链表)经常发生散列冲突时,该链表长度将会变的非 常长,为此当桶中对象数量超过8个时,在JDK 8 中会将该链表转换为红黑树进行存储,用 这种方法来提高性能。
API链接:HashSet (Java Platform SE 8 ) (oracle.com)
定义:HashMap是Java集合框架中的一个类,用于散列表中存储键值对。它继承了 AbstractMap <K,V>抽象类,实现了Map
接口,同时还实现了Cloneable(允许克隆), Serializable(可序列化)。允许空值,且不是线程安全的,也不保证键值的顺序。
实现:与上面一样,在JDK 7中,散列表是采用数组+链表实现。而在JDK 8版本中,是通过数组 +链表+红黑树实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。