哈希表HashTable提供了快速插入、查找的操作。基于数组实现
(key,value)形式存储
如果key是int型,可以直接根据key值作为数组下标
arr[key];
如果key是字符串,需要编写hashCode函数返回int值
1、对每个字母计算ASCII码求和
public int hashCode(String key){
int hashVal=0;
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96; //a=97;
hashVal+=letter;
}
return hashVal;
}
问题:key为bbb,abc,cba的hashCode都是一样的
2、幂连乘
27包括空格+26个字母
public int hashCode(String key){
//幂连乘
int hashValue=0;
int pow27=1;
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96;
hashValue+=letter*pow27;
pow27*=27;
}
return hashValue;
}
问题1:key为zhangsan字符串会导致数组arr[]越界
通过压缩可选值方法-->求余
return hashValue%arr.length;
通过使用BigInteger类型解决
public int hashCode(String key){
BigInteger hashValue=new BigInteger("0");
BigInteger pow27=new BigInteger("1");
for(int i=key.length()-1;i>=0;i--){
int letter=key.charAt(i)-96;
BigInteger letterB=new BigInteger(String.valueOf(letter));
hashValue=hashValue.add(letterB.multiply(pow27));
pow27=pow27.multiply(new BigInteger(String.valueOf(27)));
}
//压缩可选值
return hashValue.mod(new BigInteger(String.valueOf(arr.length))).intValue();
}
压缩可选值,但会出现冲突。
可以使用开放地址法、链地址法
/*
* 员工信息类
*/
public class Info {
private String key;
private String name;
public Info(String key,String name){
this.key=key;
this.name=name;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class HashTable {
private Info[] arr;
/*
* 默认构造方法
*/
public HashTable(){
arr=new Info[100];
}
/*
* 数组初始化
*/
public HashTable(int maxSize){
arr=new Info[maxSize];
}
/*
* 插入数据:将员工的id号作为索引
*/
public void insert(Info info){
arr[hashCode(info.getKey())]=info;
}
/*
* 查找数据
*/
public Info find(String key){
return arr[hashCode(key)];
}
/*
* 字母的ASCII码求和/幂连乘
*/
public int hashCode(String key){
}
}