《java编程思想》:散列的原理
以实现一个简单的HashMap为例,详细讲解在code之中。
简单解释散列原理:
1.map中内建固定大小数组,但是数组并不保存key值本身,而是保存标识key的信息
2.通过key生成数组角标,对应位置存放LinkedList,list中存放的是键值对
3.如此,无论放入多少个键值对,数组大小都不必改变,当key值生成的角标值重复时,获取对应位置的list,向list中添加键值对即可
4.当调用get()方法时,只需遍历对应角标位置的list,而不用遍历所有的键值对信息,所以加快了查询速度。
5.注意,get()和put()中使用的计算散列值,也就是数组角标的公式一定要一致,保证计算所得的角标一致
/**
* Created by Don9 on 2017/
*/
public class MyHashMap<K,V> extends AbstractMap<K,V>{
/* 1.自定义数组大小 */
static final int SIZE = 999;
/* 2.创建内部数组,数组存放的是LinkedList,而list中存放的是想要存放的键值对 */
LinkedList<MyEntry<K,V>>[] buckets = new LinkedList[999];
/* 3.put方法,此方法返回key对应的曾经的oldValue */
public V put(K key,V value){
/* 4.先定义一个返回值 */
V oldValue = null;
/* 5.根据key计算出一个散列值,用于当作内置数组的下角标(
此公式不固定,是自定义的,但是要保证结果稳定不变,同时不能大于数组size) */
int index = Math.abs(key.hashCode()) % SIZE;
/* 6.当index位置为空时,填充新的list */
if(buckets[index]==null){
buckets[index] = new LinkedList<MyEntry<K,V>>();
}
/* 7.获取index位置的list */
LinkedList<MyEntry<K, V>> bucket = buckets[index];
/* 8.MyEntry是自定义的Entry实现类,用于保存键值对,这个类也可以自定义,只要实现接口Entry即可,
新建entry保存传入的键值对 */
MyEntry<K, V> newMe = new MyEntry<K, V>(key,value);
/* 9.定义一个found标记,用于记录是否替换完毕 */
boolean found = false;
ListIterator<MyEntry<K, V>> it = bucket.listIterator();
/* 10.遍历当前位置的list */
while(it.hasNext()){
MyEntry<K, V> oldMe = it.next();
/* 11.list中已经存在了当前key */
if(oldMe.getKey().equals(key)){
/* 12.获得oldValue值,用于返回 */
oldValue = oldMe.getValue();
/* 13.用新的entry替换老的 */
it.set(newMe);
/* 14.标记改为true,说明替换完毕 */
found = true;
/* 15.跳出 */
break;
}
}
/* 16.如果未替换完毕,也就是说key值在之前的list中不存在 */
if(!found){
/* 17.添加新的entry到list中 */
bucket.add(newMe);
}
/* 18.返回oldValue */
return oldValue;
} /* 19.定义get查找方法 */
public V get(Object key){
/* 20.生成散列值,也就是数组角标,此处一定要和put方法中生成方式一致,保证相同的key生成相同的位置 */
int index = Math.abs(key.hashCode()) % SIZE;
/* 21.index位置为null,不存在key,返回null */
if(buckets[index]==null){
return null;
}
/* 22.index位置不为null,遍历查询,返回value */
for(MyEntry<K,V> me:buckets[index]){
if(me.getKey().equals(key)){
return me.getValue();
}
}
return null;
} @Override
public Set<Entry<K, V>> entrySet() {
return null;
}
}
《java编程思想》:散列的原理的更多相关文章
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- 《Java编程思想》读书笔记(二)
三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...
- Java编程思想(11~17)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...
- Java编程思想(后)
Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- Java编程思想——第17章 容器深入研究 读书笔记(三)
七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...
- Java编程思想——第17章 容器深入研究(two)
六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...
- Java编程思想—八皇后问题(数组法、堆栈法)
Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
随机推荐
- C# .Net 下 x86使用大内存的处理
/LARGEADDRESSAWARE 选项通知链接器应用程序可处理大于 2 GB 的地址. 在 64 位编译器中,默认情况下启用此选项. 在 32 位编译器中,如果未在链接器行上指定 /LARGEAD ...
- 要胀爆的Angular1.0
尝试从http请求上遏制缓存: http://blog.csdn.net/u010039979/article/details/54376856 if (!$httpProvider.defaults ...
- SVN分支与主干
我的理解:在svn版本库中创建两个目录,一个主干如truck,一个分支目录如branch(注:分支可以创建多个),分别在客户端中检出代码,在分支中进行bug的修复以及新模块的开发,开发完后再merge ...
- PHP自动加载功能原理解析
前言 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能.PHP的命名空间.PHP的PSR0与PSR4标准等内容. 一.PHP自动加载功能 PHP自动加载功能的由来 在PHP开发过 ...
- LNMP环境搭建(三:PHP)
1.获取php源码 # cd /usr/local/src/ # wget http://cn2.php.net/get/php-7.0.15.tar.gz/from/this/mirror 2.解压 ...
- 【BZOJ4016】[FJOI2014]最短路径树问题 最短路径树+点分治
[BZOJ4016][FJOI2014]最短路径树问题 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径 ...
- 九度OJ 1180:对称矩阵 (矩阵计算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2637 解决:1354 题目描述: 输入一个N维矩阵,判断是否对称. 输入: 输入第一行包括一个数:N(1<=N<=100),表 ...
- Java NIO Buffer(netty源码死磕1.2)
[基础篇]netty源码死磕1.2: NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...
- js滚动到指定位置显示或隐藏元素
$(function(){ $(window).scroll(function(){ var scroll_top=$(window).scrollTop(); console.log(scroll_ ...
- 12.Django数据库操作(执行原生SQL)
1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1& ...