资讯专栏INFORMATION COLUMN

JAVA基础整理(六)---手写简单的HashMap来学习hashmap

Travis / 366人阅读

摘要:学习手动写一个简单的进行理解结点的定义的基础时一个数组,数组里每个元素是一个,他必须包括值,键值,,下一个结点,同一个值的结点用一条链栓起来。第一个结点的特殊操作第一个对上了修改一个元素查找一个元素

HashMap学习--手动写一个简单的HashMap进行理解 1.结点Node的定义
public class Node {
    public int hash;
    public Object key;
    public Object value;
    public Node next;
}

HashMap的基础时一个数组,数组里每个元素是一个node,他必须包括:hash值,key键值,value,next下一个结点,同一个hash值的结点用一条链栓起来。

2.HashMap的定义
Node[] table;//核心数组
    int size;//元素个数
    
     public HashmapTest(){
        table=new Node[16];//初始化数组大小,尽量2的整数幂
        size=0;
    }

这个数组大小有讲究,从两个极端理解,当大小为1时,也就是所有的元素栓在一个位子上,也就是退化成了链表。如果数组很大,也就是元素所有元素几乎可以散在数组的每个位子上,也就是退化成了数组。至于取2的整数幂,可以将取余的操作使用按位&,加快速度,除法在计算机中的速度是很慢的。

3.HashMap的增删改查 增加一个元素
 public void put(K key,V value){
        Node newNode=new Node();
        Node lastNode=null;
        Boolean isRepeat=false;
        newNode.hash=myhash(key.hashCode(),table.length);//简单的计算hash值的函数,就是对数组大小进行取余,不考虑扩容以及优化
        newNode.key=key;
        newNode.value=value;
        newNode.next=null;
        if(table[newNode.hash]==null){
            table[newNode.hash]=newNode;
        }else{
            Node tmp=table[newNode.hash];
            while (tmp!=null){
                if(tmp.key.equals(key)){
                    isRepeat=true;
                    tmp.value=value;
                    break;
                }else{
                    lastNode=tmp;
                    tmp=tmp.next;
                }

            }
            if(isRepeat==false){
                lastNode.next=newNode;
            }

        }

    }
删除对应key值的元素
 public void delete(K key){
        int hash=myhash(key.hashCode(),table.length);
        Node temp=table[hash];
        Node prevNode=null;//记住前一个结点,删除时要接上。
        while(temp!=null){
            //第一个结点的特殊操作
            if(temp.key.equals(table[hash].key)){
                //第一个对上了
                if(temp.key.equals(key)){
                     table[hash]=temp.next;
                    break;
                }else{
                    prevNode=temp;
                    temp=temp.next;
                }
            }else{
                if(temp.key.equals(key)){
                    prevNode.next=temp.next;
                    break;
                }else{
                    temp=temp.next;
                }

            }
        }
    }
修改一个元素
public void set(K key,V value){
        Node temp=table[myhash(key.hashCode(),table.length)];
        while (temp!=null){
            if(temp.key.equals(key)){
                temp.value=value;
                break;
            }else {
                temp=temp.next;
            }
        }
    }
查找一个元素
 public V get(K key){
        int hash=myhash(key.hashCode(),table.length);
        Node tmp=table[hash];
        if(tmp==null){
            return null;
        }else{
            while (tmp!=null){
                if(tmp.key.equals(key)){
                    return (V)tmp.value;
                }else {
                    tmp=tmp.next;
                }
            }
            return null;
        }
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74560.html

相关文章

  • 金三银四,2019大厂Android高级工程师面试题整理

    摘要:原文地址游客前言金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。 最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨,做好全栈的装备。 原文地址:游客kutd...

    tracymac7 评论0 收藏0
  • 手写HashMap,快手面试官直呼内行!

    摘要:那既然频繁出,肯定不能是手撕红黑树我觉得面试官也多半撕不出来,不撕红黑树,那这道题还有点救,慢慢往下看。简单说来说,哈希表由两个要素构成桶数组和散列函数。所谓的哈希冲突,就是不同的经过哈希函数计算,落到了同一个下标。快手面试官真的吗我不信。手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当时就麻了,我们都知道...

    Lemon_95 评论0 收藏0
  • 记一次惨痛面试经历

    摘要:把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。堆内存用于存放由创建的对象和数组。 一次惨痛的阿里技术面 就在昨天,有幸接到了阿里的面试通知,本来我以为自己的简历应该不会的到面试的机会了,然而机会却这么来了,我却没有做好准备,被面试官大大一通血虐。因此,我想写点东西纪念一下这次的经历,也当一次教训了。其实面试官大大...

    CoorChice 评论0 收藏0

发表评论

0条评论

Travis

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<