哈希表

  哈希表可以快速成堆的检索数据,与Vector一样动态存储一系列对象,而且我们必须为存储的每一个

值都要安排关键字与之关联。 添加数据使用put(key, value),取出数据使用get(key),Hashtable

通过initial capacity和load factor两个参数调整性能。通常缺省的load factor装载因子它是一个

百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为100,而装载因子为0.9,那么当哈希

表90%的容量已被使用时,此哈希表会自动扩充成一个更大的哈希表。如果用户不赋这些参数,系统会自

动进行处理,而不需要用户操心。一般情况下0.75较好地实现了时间和空间的均衡。增大load factor

可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。 所以我们在最初设计时候必

须确定自己所需要的空间大小。
  由于作为key的对象将通过计算我们制定的函数所谓(散列函数)来确定与之对应的value的位置,因

此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object

  但是同时我们要注意:如果用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个

对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们

的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希

表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
 
  蒙了吧:呵呵其实总结起来无非一句话:哈希表就是能够快速成堆的查找数据,增大了效率,兼顾了

数组与链表的特色。
 
  随附自己的哈希表:
  public void add(String s){  
82.        if(sum>=name.length/2){  
83.            this.rehash();  
84.        }  
85.        int start = hash1(s);  
86.        int i = start;  
87.        while(name[i]!=null){  
88.            if(s.equals(name[i])){  
89.                return;  
90.            }  
91.            i = (i+hash2(s))%name.length;  
92.            if(i == start){  
93.                return;  
94.            }  
95.        }  
96.        name[i] = s;  
97.        sum++;  
98.    }  

/** 
116.     * 删除某个元素 
117.     * @param s 
118.     */ 
119.    public void remove(String s){  
120.        if(this.contains(s)){  
121.            int i = this.getValue(s);  
122.            this.name[i] = null;  
123.        }  
124.    }  
125.      
126.    /** 
127.     * 得到字符s在哈希表中的位置 
128.     * @param s 
129.     * @return 
130.     */ 
131.    public int getValue(String s){  
132.        int start = this.hash1(s);  
133.        int i = start;  
134.        while(this.name[i]!=null){  
135.            if(this.name[i].equals(s)){  
136.                return i;  
137.            }  
138.            i = (i+this.hash2(s))%this.name.length;  
139.            if(i==start){  
140.                return -1;  
141.            }  
142.              
143.        }  
144.        return -1;  
145.    }  
146.      
147.    /** 
148.     * 输出哈希表所有的元素 
149.     */ 
150.    public void print(){  
151.        for(int i=0;i<name.length;i++){  
152.            System.out.println(i+":"+name[i]);  
153.        }  
154.    }  
155.      
156.    /** 
157.     * 得到哈希表存贮的元素个数 
158.     * @return 
159.     */ 
160.    public int size(){  
161.        return this.sum;  
162.    }  
163. 
164.    /** 
165.     * 得到哈希表的长度 
166.     * @return 
167.     */ 
168.    public int length(){  
169.        return this.name.length;  
170.    }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值