Java中哈希算法及冲突处理的源码实现

Java中的Map接口,底层实现是数组+链表

数组中存储一个链表对象。

链表里再存放Key-value对象。 

容器类对象在调用remove、contains等方法时,需要比较对象是否相等,这涉及到对象类型的equals()方法和hashcode()方法。

对于自定义类型,需要重写equal()和hashCode()方法。

Java中规定,两个内容相等的对象,应该具有相等的hashcode。

package cn.zhouxj.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *自定义Map的升级版,尽量避免循环遍历
 * 提高查询的效率
 */

public class MyMap001 {

    LinkedList[] arr = new LinkedList[999] ;//定义一个数组,数组里存放的是链表,链表里存放键值对
    int size;

    public void put(Object key,Object value){

        KeyValue kv = new KeyValue(key,value);

        int a = key.hashCode()%arr.length;//需要考虑哈希冲突
        if(arr[a]==null){
            //新建一个list对象
            LinkedList list = new LinkedList();
            arr[a] = list;
            list.add(kv);
        }else{
            LinkedList list= new LinkedList();
            arr[a]=list;

            for(int i=0;i<list.size();i++){
                KeyValue kvtmp = (KeyValue)list.get(i);
                if(kvtmp.key.equals(key)){
                     kvtmp.value = value;//键值重复,直接覆盖
                    return;
                }
            }

            arr[a].add(kv);
        }
    }
    public Object get(Object key){
        int a = key.hashCode()%arr.length;
        if(arr[a]!=null){//不等于null,说明存在list,需要遍历list
            LinkedList list = new LinkedList();
            list = arr[a];
            //遍历list中所有的key
            for(int i =0;i<list.size();i++){
                KeyValue kv =(KeyValue)list.get(i);
                if((kv.key).equals(key)){
                    return kv.value;
                }
            }
        }
        return null;
    }
    public static void main(String[] args){
        MyMap001 m = new MyMap001();
        m.put(1,2);
        m.put("qwe",2);
        m.put("qwe",3);

        System.out.println(m.get("qwe"));
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值