手写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的简单实践上.所以不会对算法进行详细介绍,主要针对代码中所使用的一些函数定义与用法进行解释,并给出 ...
随机推荐
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- Can you answer these queries? (线段树
题目 题意: 初始给你n个数,通过m个操作, 操作0是使区间范围内的每一个a[i]都变成 根号a[i] ,操作1是查询区间范围内数字的和. 思路: 如果一个节点sum[rt]是1的话,根号1还是1, ...
- Django之路——7 django与ajax
Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...
- Vue钩子函数
Vue的生命周期函数 beforeCreate:function(){ console.log('1-beforeCreate 初始化之后'); }, created:function(){ cons ...
- BeautifulSoup模板简单应用-提取html指定数据(api_name/api_method/api_path,请求body/请求header/pagam参数)
from bs4 import BeautifulSoup import re import os.path import itertools name='newcrm' source_file_pa ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net
SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...
- PCL安装与配置
一.配置环境 1.win7 64位2.Visual Studio 2015 二 .准备工作 安装包准备: 移步:https://www.cnblogs.com/weiyouqing/p/8046387 ...
- vue的组件名称问题
如果组件名称中带有大写字母,那么会报错
- Github的使用/git远程提交代码到Github
Github的使用/git远程提交代码到Github Github是全球最大的社交编程及代码托管网站 Git是一个开源的分布式版本控制系统 1.基本概念 Repository(仓库):仓库用于存放项目 ...
- MongoDB 常用操作命令大全
一.数据库常用命令1.Help查看命令提示 复制代码 代码如下: helpdb.help();db.yourColl.help();db.youColl.find().help();rs.help() ...