java模拟实现hashcode查找原理

本文介绍了Java中模拟实现HashMap的hashCode查找原理。通过计算字符串的hashcode,将其映射到固定大小的数组中,形成链表结构。在查找时,先根据hashcode快速定位,再通过equals方法比较键值对,提高查询效率。文中还提供了模拟实现的代码,并对比了使用HashMap与for循环查找的时间差异,证明了HashMap在查找上的优势。
摘要由CSDN通过智能技术生成

hashcode概念
所有的对象,都有一个对应的hashcode(散列值)比如字符串“abc”对应的是1001 (实际上不是,这里是方便理解,假设的值)比如字符串“acc”对应的是1004,字符串“cba”对应的也是1001
保存数据
准备一个数组,其长度是2000,并且设定特殊的hashcode算法,使得所有字符串对应的hashcode,都会落在0-1999之间要存放的字符串是“abc”,就把该字符串和hashcode值组成一个键值对,存放在数组的第1001个位置上,要存放字符串是"acc",就把该键值对存放在数组的第1004个位置上,要存放名字是"bca"的字符串,就应该存在数组的第1001个位置上,然而 "bca"的hashcode1001对应的位置已经有abc对应的键值对了,那么就在这里创建一个链表,接在"abc"键值对后面存放“bca”
查找数据
比如要查找acc,首先计算"acc"的hashcode是1004,根据1004这个下标,到数组中进行定位,(根据数组下标进行定位,是非常快速的) 发现1004这个位置就只有一个键值对,那么该字符串是acc.
比如要查找abc,首先计算"abc"的hashcode是1001,根据1001这个下标,到数组中进行定位,发现1001这个位置有两个键值对,那么就对两个键值对的名字进行逐一比较(equals),因为此时需要比较的量就已经少很多了,很快也就可以找出目标键值对,这就是使用hashmap进行查询,非常快原理。
下面是用myhashmap模拟实现hashcode原理的代码
1.按照字符串s 用(s[0]+ s[1] + s[2] + s[3]+ s[n-1])*23.模拟生成字符串对应的hashcode

/* -*- encoding: utf-8 -*-
*'''
*@File : hashcode_e1.java
*@Time : 2020/05/14 16:11:15
*@Author : andrewq 
*@Version : 1.0
*@Contact : 653704453@qq.com
*@WebSite : not available yet==
*'''

*here put the import lib*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
class Entry{
   
    public String k;
    public int v;
    public Entry(String k,int v){
   
        super();
        this.k=k;
        this.v=v;
    }
    public String tostring(){
   
        return "["+this.k+":"+this.v+"]";
    }
}
public class Hashcode{
   
    static Entry[] entries = new Entry[100];

    public static int hashcode(String s) {
   
        int sum = 0, index;
        int len = s.length();
        for (int j = 0; j < len; j++) {
   
            sum += (int) s.charAt(j);
        }
        index = sum * 23;
        if (index > 2000) {
   
            index %= 2000;
        }
        return index;
    }

    public static Entry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值