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