容器之HashMap浅谈

HashMap是一种可以实现快速存取的数据结构,它的速度依赖一种散列机制。数组是一种可以实现快速存取的数据结构,当我们需要存放一个键值对时,我们计算键的散列码并对数组容量取余得到数组下标,将此键值对存放在此位置。查询时只要求得键的散列码就可直接找到值。但若散列码相同则会产生冲突,故我们让数组保存键值的list,若散列码相同,在list中查找是否有待查询的键,如图:
这里写图片描述
计算元素的散列码使用Object的hashCode()方法,这个时候有一个问题:若HashMap存放我们自己的类,我们又没有覆盖Object的hashCode()方法,Object类的hashCode()默认采用对象地址计算,那么本来我们认为相同的对象内容可能因为地址的不同导致无法在HashMap中找到,所以需要覆盖hashCode方法,同时也要覆盖Object的equals()方法,我们需要通过它进行比较。凡是使用散列的数据结构,我们都需要覆盖hashCode方法和equals方法。
这是HashMap的一个构造方法:

public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
}

构造方法有两个参数:一个是数组容量,一个是负载因子。
负载因子的作用:当前元素数量/容量 > 负载因子时,调整容量大小至原来的两倍。

加载因子越大,填满的元素越多,好处是,空间利用率高了,但冲突的机会加大了.链表长度会越来越长,查找效率降低。
反之,加载因子越小,填满的元素越少,好处是冲突的机会减小了,但空间浪费多了.表中的数据将过于稀疏(很多空间还没用,就开始扩容了)

默认0.75。
看了半天java8源码以后,发现底层并不是以上描述的那些,不仅是采用链表解决冲突,当链表长度超过某个值后采用红黑树,暂时不想深入了解,以后慢慢看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值