事实上不管使用数组还是链表存储数据都会存在较大缺陷,
当你使用数组时,难于删除和添加数据
当你使用链表时难于查找数据
因此hash表综合了两者的优缺点,使的查找和添加等操作既不至于复杂也不至于简单。
因此hash表的原理可以是数组中存链表,链表上存数据
简单的建立方式如下:
public class HNode{
public HNode(Item data){
this.data=data;
}
Item data;
HNode next;
HNode parent;
}//链表
public class Item {
public Item(int key,String value){
this.key=key;
this.value=value;
}
int key;
String value;
}//数据
public class MyHash {
private HNode[] memo=new HNode[32];//数组
private int count=0;
}//hash表的的简单形式
上面所形成的hash表可以用下图表示
hash表的数据添加与查找
其实也就是之前的数组与链表添加方式,查找也一样。。
添加
public void put(int key,String value){
Item it=new Item(key,value);
HNode node=new HNode(it);
int index=hashIndex(key);
if(memo[index]!=null){
memo[index].parent=node;
memo[index]=node;
}else{memo[index]=node;}/*数组下无数据时直接存入,
反之作为该数组的下个节点存入*/
count++;
int t=count/memo.length;
if(t>2){
HNode[] memo_2=new HNode[3*memo.length];
for(int i=0;i<memo.length;i++){
memo_2[i]=memo[i];
}
memo=memo_2;
//存储次数超过数组长度的三倍时就将数组变长三倍
}
}
public int size(){
return count;
}
public int length(){
return memo.length;
}
查找
public String get(int key){
int index=hashIndex(key);
Item item=memo[index].data;
return item.value;/*这样只是取到了数组下的数据,
取节点的数据则要再用链表的方式(上一个博客)*/
}
用上述方法运行此串代码:
public static void main(String[] args){
MyHash hb=new MyHash();
int k1=7773;String v1="AAAAA";
int k2=234;String v2="BBBBB";
int k3=1221;String v3="CCCCC";
int k4=343;String v4="DDDDD";
for(int i=0;i<100;i++){
hb.put(k1, v1);
}
hb.put(k2, v2);
hb.put(k3, v3);
hb.put(k4, v4);
int count =hb.size();
String word=hb.get(k2);
String word_1=hb.get(k4);
System.out.println("数组长度"+hb.length());
System.out.println("数量"+count);
System.out.println(k2+"get:"+word);
System.out.println(k4+"get:"+word_1);
}
结果如下: