手写HashMap实践
1、什么是HashMap
2、源码分析
3、手写实现
4、不足
一、什么是HashMap
hash散列 将一个任意长度通过某种算法(hash函数算法)换成一个固定值
map: 地图x,y 存储
总结: 通过HASH出来的值,然后通过值定位到map,然后value存储到这个map中
二、源码分析
HashMap在源码中的位置

Hash冲突

三、 手写实现
1、创建Map接口
public interface Map<K,V> {
public V put(K k, V v);
public V get(K k);
public int size();
public interface Entry<K, V>{
public K getKey();
public V getValue();
}
}
2、创建hashmap类
package hashmap;
public class HashMap<K,V> implements Map<K,V> {
private static int defaultLength = 16;
private static double defaultLoader = 0.75;
private Entry<K, V>[] table = null;
private int size = 0;
public HashMap() {
this(defaultLength, defaultLoader);
}
public HashMap(int length, double loader) {
defaultLength = length;
defaultLoader = loader;
table = new Entry[defaultLength];
}
@Override
public V put(K k, V v) {
size++;
int index = hash(k);
Entry<K,V> entry = table[index];
if(entry == null){
table[index] = newEntry(k, v, null);
}else {
table[index] = newEntry(k, v, entry);
}
return table[index].getValue();
}
public Entry<K,V> newEntry(K k, V v, Entry<K,V> next) {
return new Entry<K,V>(k,v, next);
}
public int hash(K k){
int m = defaultLength;
int i = k.hashCode() % m;
return i > 0 ? i: -i;
}
@Override
public V get(K k) {
int index = hash(k);
if(table[index] == null){
return null;
}
return find(k, table[index]);
}
private V find(K k, Entry<K, V> entry) {
if(k == entry.getKey() || k.equals(entry.getKey())){
if(entry.next != null) {
System.out.println("1老Value:" + entry.next.getValue());
}
return entry.getValue();
}else {
if(entry.next != null){
System.out.println("2老Value:" + entry.next.getValue());
return find(k, entry.next);
}
}
return null;
}
@Override
public int size() {
return size;
}
class Entry<K, V> implements Map.Entry<K,V>{
K k;
V v;
Entry<K,V> next;
public Entry(K k, V v, Entry<K, V> next) {
this.k = k;
this.v = v;
this.next = next;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
}
}
3、测试
public class TestHashMap {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("z","1234");
//System.out.println("z:" + map.get("z"));
map.put("z","5678");
System.out.println("z:" + map.get("z"));
}
}
四、不足之处:
每当hashmap扩容的时候需要重新去add entry对象 需要重新Hash。然后放入新的entry table数组里面。影像效率。 如果你知道hashmap需要存多少个值,如几千或者几万的时候,最后就是先指定他们的扩容大小,防止在put的时候再次扩容。
手写HashMap实践的更多相关文章
- 手写HASHMAP
手写HASHMAP const int MAXN=10010; const int HASH=10100; //需要hash的数的总个数最大值 struct HASHMAP { ...
- 手写HashMap,快手面试官直呼内行!
手写HashMap?这么狠,面试都卷到这种程度了? 第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章: 这--我当时就麻了,我们都知道HashMap的数据结构是数组+链表+红黑 ...
- 手写IOC实践
一.IOC 1.什么是IOC? 控制反转(英语:Inversion of Control,缩写为IoC),是[面向对象编程]中的一种设计原则,可以用来减低计算机代码之间的[耦合度]其中最常见的方式叫做 ...
- 手写hashmap算法
/** * 01.自定义一个hashmap * 02.实现put增加键值对,实现key重复时替换key的值 * 03.重写toString方法,方便查看map中的键值对信息 * 04.实现get方法, ...
- 3 手写Java HashMap核心源码
手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...
- 手写一个简单的HashMap
HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...
- 2 手写Java LinkedList核心源码
上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...
- hdu5183Negative and Positive (NP))——手写Hash&&模板
题意:问是否存在一段区间其加减交错和为K. 显然,我们可以用set保存前缀和,然后枚举一个端点查找.具体的 若在st1中查找 $t$,为 $sum-t=-k$,在st2中则是 $sum-t=k$. 注 ...
- Tensorflow实践:CNN实现MNIST手写识别模型
前言 本文假设大家对CNN.softmax原理已经比较熟悉,着重点在于使用Tensorflow对CNN的简单实践上.所以不会对算法进行详细介绍,主要针对代码中所使用的一些函数定义与用法进行解释,并给出 ...
随机推荐
- 十七、存储过程&自定义函数详解
代码中被[]包含的表示可选,|符号分开的表示可选其一. 需求背景介绍 线上程序有时候出现问题导致数据错误的时候,如果比较紧急,我们可以写一个存储来快速修复这块的数据,然后再去修复程序,这种方式我们用到 ...
- linux maven 安装与配置
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构 ...
- CasPHP 便捷简单的 ThinkPHP 框架
便捷简单的 PHP 框架,自适应后台管理界面 Convenient and succinct(便捷的 简明的;言简意赅的) 核心框架:framework: 5.1.28助手函数:think-helpe ...
- yolov3---报"段错误"的可能原因及解决方法
参考: ************************************************************************************************ ...
- MySQL延迟 查询主表
在主外键表存在关系的时候如果加上"lazy=true"的话,则表明延迟,即只查询主表中的内容,而不查询外键表中的内容. <hibernate-mapping> < ...
- destoon7.0的商业圈应用于6.0下修改方案
因为destoon7.0发布了,于是自己作死又下载了7.0,看了看7.0的模板确实比6.0好看多了,所以就打算把7.0的模板应用于6.0,在商业圈上出了一个问题,就是商业圈的圈子7.0调用与6.0不同 ...
- 解决jdbc向数据库存入数据出现乱码的情况
解决办法 1.修改项目的编码,建议统一使用utf-8来实现,这样整个项目就是utf-8. 2.jdbc:mysql://locathost:3306/数据库名称?useUnicode=true& ...
- 使用C#的HttpWebRequest模拟登陆访问人人网(转)
无论使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest:第二 模拟POST或者GET方式提交 ...
- Java - 框架之 SpringMVC
一. 简单配置 (XML) 1. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-ap ...
- python 类 双下划线解析
__getattr__用法:说明:这是python里的一个内建函数,当调用的属性或者方法不存在时,该方法会被调用调用不存在的属性调用不存在的方法