理解HashMap底层原理,一个简单的HashMap例子

package com.jl.testmap;

/**
 *  自定义一个HashMap
 * @author JiangLai
 *
 */
public class MyHashMap<K,V> {

    Node<K,V>[] table;//位桶数组
    int size;//存放键值对的个数

    public MyHashMap() {
        table = new Node[16];//长度一般定义为2的整数次幂
    }

    public void put(K key,V value) {

        //定义新的节点对象
        Node newNode = new Node();
        newNode.hash = myHash(key.hashCode(), table.length);
        newNode.key = key;
        newNode.value = value;
        newNode.next = null;

        Node temp = table[newNode.hash];

        Node itorLast  = null;//正在遍历的最后一个元素

        if(temp==null) {
            //此处数组元素为空,则直接将新节点放入
            table[newNode.hash] = newNode;
            size++;
        }else {
            //此处数组元素 不为空,则遍历整个链表
            while (temp!=null) {
                //判断key是否重复,相同则替换,
                if(temp.key.equals(key)) {
                    temp.value = value;//只是覆盖value即可,其他的值不变。(hash,key,next)
                    break;
                }else {//如果不重复,则遍历下一个
                    itorLast = temp;
                    temp = temp.next;
                }

            }

            if(itorLast!=null) {
                itorLast.next = newNode;
                size++;
            }
        }
    }

    public V get(K key) {

        int hash = myHash(key.hashCode(), table.length);

        Object value = null;

        if(table[hash] != null) {
            Node<K,V> temp = table[hash];
            while (temp!=null) {
                if(temp.key.equals(key)) {//如果相等,则返回对应的值
                    value = temp.value;
                    break;
                }else {
                    temp = temp.next;
                }
            }
        }

        return (V)value;
    }

    //计算Hash值
    public int myHash(int v,int length) {
        //二者作用一样
//        System.out.println(v&(length-1));//直接位运算,效率高.
//        System.out.println(v%(length-1));//取余运算,效率低.
        return v&(length-1);
    }

    @Override
    public String toString() {
        //{10:aa,20:bb}
        StringBuilder sb = new StringBuilder("{");

        //遍历数组
        for(int i=0;i<table.length;i++) {
            Node<K,V> temp = table[i];//当前元素
            //遍历链表
            while (temp!=null) {
                //当前元素的key和value
                sb.append(temp.key+":"+temp.value+",");
                //当前元素的下一个元素
                temp = temp.next;
            }
        }

        sb.setCharAt(sb.length()-1, ‘}‘);

        return sb.toString();
    }

    public static void main(String[] args) {
        MyHashMap<Integer,String> map01 = new MyHashMap<>();
        map01.put(10, "001");
        map01.put(20, "002");

        System.out.println(map01);

        System.out.println(map01.get(10));
    }

}
package com.jl.testmap;

/**
 * 用于TestHashMap中
 * @author JinagLai
 */
public class Node<K,V> {

     int hash;//HashCode
     K key;//键
     V value;//值
     Node<K,V> next;//下一个节点

}

原文地址:https://www.cnblogs.com/JiangLai/p/10083507.html

时间: 12-07

理解HashMap底层原理,一个简单的HashMap例子的相关文章

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

一个简单的KVO例子

一个简单的KVO例子. 两个界面,第一个界面显示名字和配偶(spouse)名字,第二个界面显示修改名字和配偶名字,返回时,将看到第一个界面的名字显示发生改变. 首先定义一个person类作为model. #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString

Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的.然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁.flag的作用就是让A和B获得不同的锁. public class TestDeadLock { public void run() { MyThread mt = new MyThread(); ne

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th

深入理解Spring--动手实现一个简单的SpringIOC容器

接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的不到位,说白了,就是仅仅停留在会用的阶段,有一颗想读源码的心于是买了一本计文柯的<Spring技术内幕>,第二章没看完,就被我扔一边了,看的那是相当痛苦,深深觉得自己资质尚浅,能力还不够,昨天在网上碰巧看到一个实现简单的SpringIOC容器的视频教程,于是跟着做了一遍,竟然相当顺利,至少每一行代码都能理解,于是细心整理了一番,放在这里. 主要思想: 提到

Eclipse搭建Struts框架,及一个简单的Struts例子

一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包含了开发struts2所需的struts2-core.jar核心包以及其它struts2所依赖的JAR文件,另外还有一些struts2的示例程序以及一些HTML的API文档. 二.试用struts2.0.1 1. 新建一个WEB工程,将struts-2.0.1-all.zip压缩包中的lib目录下的所有jar文件拷贝到WEB工

温习一个简单的HTML例子

<!--程序ch02_1.html--> <html> <head> <title>第一个HTML网页</title> </head> <body text="blue"> Heelo,<b>world</b>! <hr size="5px" align="left" color="red" width="

[theano]入门-一个简单训练的例子

#!/usr/bin/env python # coding=utf-8#这个例子相对来讲比较简单可以作为训练编程的模板 import numpy import theano import theano.tensor as T rng = numpy.random N = 400 feats = 784 D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2)) training_steps = 10000 # Declare Th

Html5 Canvas一个简单的画笔例子

相比了下Qt quick的canvas和HTML5的canvas,发现HTML5 Canvas在同样绘制绘制操作下性能比Qt的canvas强很多,附上一个HTML5 canvas画笔一例子 var DW = function( canvasid){ this._points = []; this._canvas = document.getElementById( canvasid ); this._ctx = this._canvas.getContext("2d"); this._

java的一个简单死锁的例子

/* * 演示死锁:(由毕向东视频所得) * 一种解释:Thread—0拿到lock1锁,Thread—1拿到lock2锁,Thread—0想要lock2锁而Thread-1想要lock1锁, * 两个线程都无法继续执行下去,产生死锁. * 执行结果:Thread-0 if.....lock1 *  Thread-1 else....lock2 */package com.dld; public class DeadLockDemo { public static void main(Strin