容器之HashMap浅谈

来源:互联网 发布:国家知织产权局专利局 编辑:程序博客网 时间:2024/06/07 06:32

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
原创粉丝点击