哈希表可以快速成堆的检索数据,与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. }