容器之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源码以后,发现底层并不是以上描述的那些,不仅是采用链表解决冲突,当链表长度超过某个值后采用红黑树,暂时不想深入了解,以后慢慢看。
- 容器之HashMap浅谈
- Java容器之HashMap
- 浅谈一下HashMap容器的遍历
- java容器之八_hashTable与hashMap
- 源码分析之-容器类-HashMap
- java基础-数据容器之Map-HashMap
- 浅谈面试之HashMap的工作原理
- HashMap容器
- 浅谈HashMap
- 浅谈HashMap
- 浅谈HashMap
- 浅谈HashMap
- 浅谈HashMap
- 深入理解容器系列片之四--------HashMap原理
- 深入理解容器系列之四--------HashMap原理
- JDK容器学习之HashMap (二) : 读写逻辑详解
- 新手上路之容器HashMap遍历总结 笔记
- JDK容器学习之HashMap (三) : 迭代器实现
- 在iOS中读取本地文件
- HashMap是如何来的
- 【机器学习】判别模型vs生成模型
- 阿里面试题-如何减少上下文切换?
- Java lambda 表达式
- 容器之HashMap浅谈
- CC3200库函数调用-自用控制引脚
- 475. Heaters
- vue.js $set的使用 数组
- 离散数学数理逻辑部分部分稿件loading
- 消除RadioButton中的自带的圆圈
- PHP CURL模拟登录 获取数据
- 青蛙变态跳台阶
- MySQL中间件Atlas快速安装