浅谈哈希表

前段时间学习了哈希表,由于各种原因,直到今天才有时间写博客,现在让我来谈谈我对哈希表的理解。

哈希表是一种数据结构,它可以提供快速的插入和查找操作。不论hash表中有多少数据,插入和删除,都只需要O1)的时间复杂度。所以如果不需要有序遍历数据,并且可以提前预测数据量的大小,那么使用哈希表往往是方便和快捷的。

使用哈希表时,由于不同的关键字可能得到同一个哈希地址,这种现象称之为冲突。

在诸多大神们的总结下,有以下几种两种常见的方法解决冲突:

1、开放地址法

     即发生冲突时,把冲突的数据项放在数组的其他位置

2、链地址法

即在冲突的位置上设置一个链表结构,把冲突的数据项放入其中。但是当数据量非常巨大时,其性能将大大的降低,这就需要给它进行扩容,称之为rehash

分析完毕,让我们来谈谈代码吧。

(1)插入方法

计算keyhash值,这里调用hashCode()方法来计算hash值;

计算index值,作为table的下标,即table[index]

private int getKey(String id)

int key=id.hashCode(); 

int index=(key)%(array.legth)

return index;

public void add(E e)

int index=getKey(e.getId()); 

if(array[index]==null){ 

LinkedList<E> l=new LinkedList<E>(); 

l.add(e); 

array[index]=l; 

}else

array[index].add(e); 

if((count++)>=threshold){ 

rehash(2*array.length); 

(2)查找方法

public get(String id)

int index=getKey(id); 

//遍历链表 

for(int i=0;i<array[index].size();i++){ 

if(array[index].element().getId()==id){ 

E e=array[index].element(); 

return e; 

return null; 

}

(3)删除方法

public void remove(String id)

int index=getKey(id); 

for(int i=0;i<array[index].size();i++){ 

if(array[index].element().getId()==id){ 

E e=array[index].remove(); 

(4)哈希表通用方法演示程序

 Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();

 for(int i=0;i<=10000000;i++){

 numbers.put("hash"+i, i);

 }

       

 long time1=System.currentTimeMillis();

        Integer n = numbers.get("hash1000000");

        long time2=System.currentTimeMillis();

        long s = time2-time1;

        System.out.println("查询时间为:"+s);

        Integer nn = numbers.get("hash88");

        

        if(n != null)

            System.out.println(n);

            System.out.println(nn);

}

<!--EndFragment-->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值