Java HashMap底层实现

Step1:定义节点类
//用于SxtHashMap
public class Node2<K,V> {

    int hash;
    K key;
    V value;
    Node2 next;

}
Step2:构造主框架
package com.ysl.mycollection;

public class SxtHashMap<K,V> {
    Node2[] table; //位桶数组
    int size;

    public SxtHashMap(){

    }

    public void put(K key,V value){
        
    }

    public V get(K key){
      
    }

    @Override
    public String toString() {
        
    }
    public int myHash(int v, int length){

    }

    public static void main(String[] args) {
        

    }

}

Step3:定义方法
	public SxtHashMap(){
        table = new Node2[16];
    }

    public void put(K key,V value){
        Node2 newNode = new Node2();
        newNode.hash = myHash(key.hashCode(),table.length);
        newNode.key = key;
        newNode.value = value;
        newNode.next = null;

        Node2 temp = table[newNode.hash];

        Node2 iterLast = null;//正在遍历的最后一个元素

        boolean keyRepeat =false;//key是否重复
        if (temp==null){
            //此处数组为空,直接将新节点放进去
            table[newNode.hash] = newNode;
            size++;
        }
        else {
            while (temp!=null){
                //key重复,则覆盖
                if(temp.key.equals(key)){
                    keyRepeat = true;
                    temp.value=value;
                    break;
                }
                //key不重复
                else {
                    iterLast =temp;
                    temp=temp.next;
                }
            }
            if(!keyRepeat){ //没有发生key重复,则添加到链表最后
                iterLast.next = newNode;
                size++;
            }
        }

    }


    public V get(K key){
        int hash = myHash(key.hashCode(),table.length);
        V value = null;
        if(table[hash]!=null){
            Node2 temp = table[hash];
            while(temp!=null){
                if(temp.key.equals(key)){
                    return (V)temp.value;
                }
                else {
                    temp=temp.next;
                }
            }
        }
        return value;
    }



    @Override
    public String toString() {
        StringBuilder sb =new StringBuilder();
        sb.append('{');
        for(int i=0;i<table.length;i++){
            Node2 temp = table[i];
            while (temp!=null){
                sb.append(temp.key+":"+temp.value+",");
                temp= temp.next;
            }
        }
        sb.setCharAt(sb.length()-1,'}');
        return  sb.toString();

    }

    public int myHash(int v, int length){
//        System.out.println("hash in myhash:"+(v&(length-1)));
//        System.out.println("hash in myhash:"+(v%(length-1)));

        return v&(length-1);
    }
Step3:应用
 public static void main(String[] args) {
        SxtHashMap<Integer,String> m = new SxtHashMap<>();
        m.put(53,"aa");
        m.put(69,"bb");
        m.put(85,"cc");

        System.out.println(m);
        System.out.println(m.get(53));

    }
Step4:示例

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值