哈希表基础知识

3 篇文章 0 订阅
1 篇文章 0 订阅

Hash表的基础知识

关于Hash表

哈希表(Hash Table)是根据关键码(key) 值(value)进行直接访问的数据结构。哈希表最大的优点是高效,在哈希表中插入、删除或查找一个元素都只需要O(1)的时间。因此,哈希表常用来优化时间效率。

哈希表的对应类型

在Java中,哈希表有两个对应的类型,即HashSet 和 HashMap。

关于HashSet

HashSet这个类实现了Set集合。这个类允许null。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

并且HashSet提供了三个构造函数:

  • 1、第一个是无参构造函数,此函数会创建一个大小为16的容器,加载因子是0.75

public HashSet()
Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75).

Set的子类大部分是无序的、不可重复(TreeSet是有序的)。

  • HashSet:线程不安全,存取速度快,内部实现是HashMap的key entry
    1、默认初识容量为16(为什么是16,16是2^4,可以提高查询效率,另外,32=16<<1,扩容只需左移,速度很快)。
    2、加载因子为0.75:即为 元素个数 超过 容量长度的0.75倍时,进行扩容
    3、扩容增量:增加一倍,HashSet的容量为16,一次扩容后时容量为32

那么接下来思考,容器怎么保证添加的元素不重复的呢?(由于Set取值的时候调用值本身来取值的,所以不能重复,如果重复了,根据值取的时候就不知道取哪一个。List是根据下标map是根据具体key取值)

接下来看一下HashSet的add方法:
在这里插入图片描述
这个方法实际上是添加的一个put方法,描述的意思是:向这个set集合中添加元素,如果这个元素没有在集合中则添加到这个集合中。如果这个集合已经存在元素调用将离开。
e是add添加的元素,而PRESENT 在HashSet中是这样定义的 private static final Object PRESENT = new Object();

  • 2、public HashSet(Collection<? extends E> c)
    构造一个包含指定集合中的元素的新集合
  • 3、public HashSet(int initialCapacity)
    构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。
  • 4、HashSet(int initialCapacity, float loadFactor)
    构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。

HashSet的常用函数

序号函数函数功能
1add在HashSet中添加一个元素
2contains判断HashSet中是否包含一个元素
3remove从HashSet中删除一个元素
4size返回HashSet中元素的数目

HashMap

如果每个元素都存储在一个值到另一个值的映射,那么就用HashMap。例如,如果不仅要存储一个文档中的所有单词,同时还关心每个单词在文档中出现的位置,则可以考虑用HashMap,单词作为HashMap的键而单词的位置作为值。

关于Hash算法解决哈希冲突的一般有四种解决方法

1、开放地址法

所谓开放地址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列标足够大,空的散列地址总能找到,并将记录存入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值