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. 安装sqlite3

    说明 当前操作在root用户下执行 1.安装编译工具 yum -y groupinstall "Development tools" yum -y install zlib-dev ...

  2. visual studio 应用场景

  3. Javascript诞生记 [转载]

    1. "1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动 ...

  4. javascript详解1

    推荐学习链接: https://book.apeland.cn/details/356/ http://es6.ruanyifeng.com/#README https://developer.moz ...

  5. 《你说对就队》第九次团队作业:【Beta】Scrum meeting 1

    <你说对就队>第九次团队作业:[Beta]Scrum meeting 1 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 < ...

  6. test20190725 夏令营测试11

    50+80+90=220.(每题满分90) 砍树 小A在一条水平的马路上种了n棵树,过了几年树都长得很高大了,每棵树都可以看作是一条长度为a[i]的竖线段.由于有的树过于高大,挡住了其他的树,使得另一 ...

  7. linux 中截取字符串

    shell中截取字符串的方法有很多中,${expression}一共有9种使用方法.${parameter:-word}${parameter:=word}${parameter:?word}${pa ...

  8. 3D-2D透视投影数学推导

    请尊重作者,禁止私自盗用图片!

  9. nginx优化、负载均衡、rewrite

    nginx优化 # 普通用户启动 (useradd nginx -s /sbin/nologin -M) user nginx; # 配置nginx worker进程个数 #worker_proces ...

  10. Ubuntu 下面手动安装 Redis

    1.下载 wget http://download.redis.io/releases/redis-2.8.17.tar.gz .tar.gz cd redis- make 2.复制文件到bin目录 ...