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实践的更多相关文章

  1. 手写HASHMAP

    手写HASHMAP const int MAXN=10010; const int HASH=10100;            //需要hash的数的总个数最大值 struct HASHMAP { ...

  2. 手写HashMap,快手面试官直呼内行!

    手写HashMap?这么狠,面试都卷到这种程度了? 第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章: 这--我当时就麻了,我们都知道HashMap的数据结构是数组+链表+红黑 ...

  3. 手写IOC实践

    一.IOC 1.什么是IOC? 控制反转(英语:Inversion of Control,缩写为IoC),是[面向对象编程]中的一种设计原则,可以用来减低计算机代码之间的[耦合度]其中最常见的方式叫做 ...

  4. 手写hashmap算法

    /** * 01.自定义一个hashmap * 02.实现put增加键值对,实现key重复时替换key的值 * 03.重写toString方法,方便查看map中的键值对信息 * 04.实现get方法, ...

  5. 3 手写Java HashMap核心源码

    手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...

  6. 手写一个简单的HashMap

    HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...

  7. 2 手写Java LinkedList核心源码

    上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...

  8. hdu5183Negative and Positive (NP))——手写Hash&&模板

    题意:问是否存在一段区间其加减交错和为K. 显然,我们可以用set保存前缀和,然后枚举一个端点查找.具体的 若在st1中查找 $t$,为 $sum-t=-k$,在st2中则是 $sum-t=k$. 注 ...

  9. Tensorflow实践:CNN实现MNIST手写识别模型

    前言 本文假设大家对CNN.softmax原理已经比较熟悉,着重点在于使用Tensorflow对CNN的简单实践上.所以不会对算法进行详细介绍,主要针对代码中所使用的一些函数定义与用法进行解释,并给出 ...

随机推荐

  1. 十七、存储过程&自定义函数详解

    代码中被[]包含的表示可选,|符号分开的表示可选其一. 需求背景介绍 线上程序有时候出现问题导致数据错误的时候,如果比较紧急,我们可以写一个存储来快速修复这块的数据,然后再去修复程序,这种方式我们用到 ...

  2. linux maven 安装与配置

    Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构 ...

  3. CasPHP 便捷简单的 ThinkPHP 框架

    便捷简单的 PHP 框架,自适应后台管理界面 Convenient and succinct(便捷的 简明的;言简意赅的) 核心框架:framework: 5.1.28助手函数:think-helpe ...

  4. yolov3---报"段错误"的可能原因及解决方法

    参考: ************************************************************************************************ ...

  5. MySQL延迟 查询主表

    在主外键表存在关系的时候如果加上"lazy=true"的话,则表明延迟,即只查询主表中的内容,而不查询外键表中的内容. <hibernate-mapping> < ...

  6. destoon7.0的商业圈应用于6.0下修改方案

    因为destoon7.0发布了,于是自己作死又下载了7.0,看了看7.0的模板确实比6.0好看多了,所以就打算把7.0的模板应用于6.0,在商业圈上出了一个问题,就是商业圈的圈子7.0调用与6.0不同 ...

  7. 解决jdbc向数据库存入数据出现乱码的情况

    解决办法 1.修改项目的编码,建议统一使用utf-8来实现,这样整个项目就是utf-8. 2.jdbc:mysql://locathost:3306/数据库名称?useUnicode=true& ...

  8. 使用C#的HttpWebRequest模拟登陆访问人人网(转)

    无论使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest:第二 模拟POST或者GET方式提交 ...

  9. Java - 框架之 SpringMVC

    一. 简单配置 (XML) 1. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-ap ...

  10. python 类 双下划线解析

    __getattr__用法:说明:这是python里的一个内建函数,当调用的属性或者方法不存在时,该方法会被调用调用不存在的属性调用不存在的方法