Map之HashMap

HashMap底层实现了哈希表,非常重要的数据结构。
哈希表的基本结构是 数组+链表

取数据过程:

1、获得key的hashcode,通过hash()散列算法得到hash值,进而定位到数组的位置。
2、在链表上挨个比较key对象,调用equals()方法,将key对象和链表上所有节点的key对象进行比较,直到碰到返回true的节点对象为止。
3、返回equals()为true的节点对象的value对象。

两个内容相同的equals方法为true的对象必须是相等的hashcode。

手动实现Map:put存储键值对

package  cn;

import javax.xml.soap.Node;

public class  TestMap{
    Node2[] table ;//位桶数组
    int size;


    public TestMap() {
        table = new Node2[16];//长度一般定义成2的整数幂
    }

    public void put(Object key,Object 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];

        if(temp == null){
            table[newNode.hash] = newNode;
        }

    }

   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 );

   }

    public static void main(String args[]){
        TestMap t = new TestMap();
        t.put(10,"aa");
        t.put(11,"bb");
        t.put(12,"cc");


    }
}

重写toString方法:

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("{");

        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();
    }

增加对应的get方法:

    public Object get(Object key){
        int hash = myHash(key.hashCode(),table.length-1);

        Object value = null;
        if(table[hash] !=null){
            Node2 temp = table[hash];

            while(temp !=null){
                if(temp.key.equals(key)){
                    value = temp.value;
                    break;
                }else{
                    temp = temp.next;
                }
            }
        }

        return  value;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值