美文网首页
HashMap 分析 实现

HashMap 分析 实现

作者: coder_斛律光 | 来源:发表于2018-04-23 22:41 被阅读33次

HashMap 这个集合经常用到的

  1. 首先什么是hash 写一个hash算法
  • 第一步简单的hash
typedef struct Entry{
    int key;
    char value;
} Entry;

extern int maxsize = 10;
//定义一个数组
Entry *values[10] = {};

//hash计算
int hash(int key,char value){
    int position = key%maxsize;
    //key相同的就覆盖了
    if(*(values+position) == NULL){
        Entry * temp = (Entry *)malloc(sizeof(Entry));
        temp->key = key;
        temp->value = value;
        *(values+position) = temp;
        return 0;
    }
    return -1;
}

分析hash 就是简单的对传递过来的key对数组长度取余
这时候有一个问题

  1. 如果一个key对长度取余的时候 和原来的相同怎么办 也就是他俩占一个位置
  2. 上边那种情况 如果余数相同 那可能是同一个key这个时候需要覆盖就好了

解决上边的问题

  1. 我们每次进行插入的时候 需要进行查找操作 也就是这个key是不是存在

先写一个查找的方法

/**
 查看是否存在
 **/
int searchKey(int key){
    int position = key%maxsize;
    if(*(values+position) == NULL){
        return 1;
    }else{
        return 0;
    }
}
  1. 如果这个key不存在 而且余数的位置已经被占用了 那我们得把他放到链表里
  2. 也就是链表里存放的是取余数相同的key的元素 那也需要查找到最后一个然后插入(先不管我们的最后和java设计的一样不一样 我们先实现了这个功能再说)
//加上一个next域
typedef struct Entry{
    int key;
    char value;
    struct Entry *next;
} Entry;

/**
 判断key值是否相同
 
 **/
int isExist(int position,int key,char value){
    //先看数组里的元素是否相同 如果相同 那就直接把值替换掉就可以了
    if((*(values+position))->key == key){
        (*(values+position))->value = value;
        return 0;
    }
    //数组里的值不同 这个时候需要遍历这个链表 如果链表中的和他相同 那就替换value 如果不同插入到next域中
    Entry *p = (*(values+position))->next;
    while(1){
        if(p->key == key){
            p->value = value;
            return 0;
        }
        if(p->next != NULL)
            p=p->next;
        else
            break;
    }
    Entry *newEntry = (Entry*)malloc(sizeof(Entry));
    newEntry->key = key;
    newEntry->value = value;
    newEntry->next = NULL;
    p->next = newEntry;
    return 1;
}

到此我们就用c语言简单的实现了一个hashmap
思路就是和java中的hashmap

  • 定义一个Entry key value next 这种结构
  • 然后定义一个数组存放Entry
  • 通过key对数组长度取余数 进行存放
  • 如果key不同的情况下 余数相同 解决冲突 通过链表的形式

相关文章

  • HashMap

    参考 HashMap深度分析 HashMap的实现

  • HashMap源码分析

    HashMap源码分析 本文对jdk1.8的HashMap做了分析 首先看一下HashMap的继承图: 1.实现了...

  • What?HashMap的实现原理?

    参考文章:HashMap实现原理及源码分析 背景 上一篇文章《哈希表、hashCode、HashMap的实现》讲述...

  • ConcurrentHashMap源码分析(JDK8)

    导入 ConcurrentHashMap是HashMap的线程安全版本的实现版本,关于HashMap的分析总结,可...

  • HashMap实现原理分析及实现

    一.hashMap实现原理分析 HashMap底层实现方式:散列链表,即数组+链表 hash表:也叫散列表,是通过...

  • HashMap 分析 实现

    HashMap 这个集合经常用到的 首先什么是hash 写一个hash算法 第一步简单的hash 分析hash 就...

  • HashMap源代码解析

    请大家多多指教、讨论,谢谢?分析版本为JDK1.8 类注释 HashMap实现了Map接口。HashMap实现了所...

  • Java中HashMap底层实现原理(JDK1.8)源码分析

    Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个...

  • HashMap源码实现分析

    HashMap源码实现分析 一、前言 HashMap 顾名思义,就是用hash表的原理实现的Map接口容器对象,那...

  • LinkedHashMap 详解及源码简析

    一、前言 在 HashMap详解以及源码分析 这篇文章中,对 HashMap 的实现原理进行了比较深入的分析。而在...

网友评论

      本文标题:HashMap 分析 实现

      本文链接:https://www.haomeiwen.com/subject/cmhzkftx.html