当前位置:   article > 正文

手写HashMap_c++手写hashmap

c++手写hashmap

最近跟一个朋友聊天,谈到去百度面试让手写HashMap,当时没思路面试就挂了。

想到这里我打算巩固一下自己的基础知识,亲自动手实现一下HashMap.

HashMap底层=数组+链表

HashMap底层源码通过 链表法来解决hash冲突,找到hash值对应位置不为空,维护一个链表。

实现如下:

1.首先定义一个接口

  1. public interfaceERMap<K,V> {
  2. Vput(K key,V value);
  3. Vget (K key);
  4. intsize();
  5. //定义一个内部接口
  6. //可以根据Entry对象拿到这个对象的key和value
  7. interfaceEntry<K,V>{
  8. KgetKey();
  9. VgetValue();
  10. }
  11. }

2.然后定义一个实现类

  1. public class ERHashmap<K,V> implements ERMap<K, V> {
  2. private static Integer defaultLength = 16;//定义数组长度(定义成2的倍数)
  3. private static double defaultLoad=0.75;//定义负载因子(超过这个因子就会扩容)
  4. private Entry<K,V>[] table =null;//定一个数组,盛放Entry对象
  5. private int size=0;//定义一个常量,用来记录数组元素个数
  6. //定义构造函数,
  7. ERHashmap(int defaultLength,double defaultLoad){
  8. this.defaultLength=defaultLength;
  9. this.defaultLoad=defaultLoad;
  10. table=new Entry[defaultLength];//定义一个默认数组,长度就是传过来的长度
  11. }
  12. ERHashmap(){
  13. this(defaultLength,defaultLoad);
  14. }
  15. public V put(K key, V value) {
  16. //得到要放的数据的位置:也就是数组的下标
  17. int index=this.getIndex(key);
  18. //根据这个下标判断该数据是否有数据
  19. Entry<K,V> e =table[index];
  20. if(null==e){
  21. table[index]=new Entry(key,value,null,index);
  22. size++;//数组长度加1
  23. }else{
  24. Entry newEntry =new Entry(key,value,e,index);
  25. table[index] = newEntry;
  26. }
  27. return table[index].getValue();
  28. }
  29. //找数组下标的方法
  30. private int getIndex(K key){
  31. //除留取余数法
  32. //m的取值是比数组长度小的质数的最大值
  33. //这里定义的长度为16,那么m就是13
  34. int m=this.defaultLength-3;
  35. return key.hashCode() % m;
  36. }
  37. public V get(K key) {
  38. //得到要放的数据的位置:也就是数组的下标
  39. int index=this.getIndex(key);
  40. Entry entry = table[index];
  41. V v = null;
  42. if(entry == null){
  43. return null;
  44. }
  45. else{
  46. while(entry != null)
  47. if(entry.getKey() == key){
  48. v = entry.getValue();
  49. break;
  50. }else{
  51. entry = entry.next;
  52. }
  53. }
  54. return v;
  55. }
  56. public int size() {
  57. return size;
  58. }
  59. class Entry<K,V> implements ERMap.Entry<K, V>{
  60. K key;
  61. V value;
  62. Entry<K,V> next;
  63. int index;//记录下标
  64. Entry(K k,V v,Entry<K,V> n,int inx){
  65. key=k;
  66. value=v;
  67. index=inx;
  68. next=n;//数组第一个元素的下一个元素
  69. }
  70. public K getKey(){
  71. return key;
  72. }
  73. public V getValue(){
  74. return value;
  75. }
  76. }
  77. }

3.测试

  1. public class test {
  2. public static void main (String[] args){
  3. ERHashmap map = newERHashmap();
  4. map.put("jiang","tong");
  5. map.put("zhao", "rui");
  6. System.out.println(map.get("jiang"));
  7. System.out.println(map.get("zhao"));
  8. }
  9. }

经过测试正确输出了key对应的value!!!一个简单的HashMap成功实现,感觉棒棒哒!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/227380
推荐阅读
  

闽ICP备14008679号