`
西口西
  • 浏览: 10001 次
社区版块
存档分类
最新评论

T-T..hashtable

    博客分类:
  • java
 
阅读更多
刚开始听说hashtable,hash,hashcode,这几个东西放一起真是让人不着头脑,还以为hash是个人名,像Huffman什么的 。原来hash就是散列的意思,hashtable也就是散列表,hash是一种散列算法,而hashcode是根据对象的数据算出来的一个int值。
主要说说hashtable吧,hashtable的实现方式有多重,就常见(我刚搞懂)的拉链法来说,它就是一个链表数组。来看度娘给的图:


具体hashtable里数据怎么存的呢?
先搞定key和value的关联,方法多种, 总之你要存的对象需要被打包成(key+value)的形式(entry<K,V>类的对象)啦,现在可以往hashtable里存了。
hashcode=hashcode(对 象的key)---->hash=hash(hashcode)---->i=indexfor(hash,table.length),i 就在数组中当下标。当对象的i值重复时(冲突),链表往后接一个,再把数据存进去就行啦。
恩,就是这么个样子,把两种数据结构(数组和链表)组合起来咯~综合了两者的优点,既能够利用数组快速定位,又能使用链表方便的插入和删除,简直鸡汁23333。
呐,既然构思都有了,那如何最大限度的利用hashtable的优点呢~话说如果每个数组中的链表只存一个数据,那hashtable就是个普通数组,同理如果数据都挤着存在一条链表里面,那hashtable就等同于一个链表了,还折腾个毛线吻。因此就需要把数据尽可能的分散的存到数组的各个位置,数组长度和每个数组元素也就是每条链表的长度要长短合适(合适。。。看到这种词就伐开心了犹豫),具体根据需要存数的数量决定咯,因此使用hashtable的前提之一就是对要存储的数据量有一个大致的估计。一个好的hashtable既不浪费空间,又能方便快速的查找到数据,关键就是对分散函数和链表长度的把握啦。
问题又来了。数据是无穷多哒。。一直存一直存,不说爆表至少会使查找速度变慢吧,恩,然后就又出来一个词rehash(感觉英汉词典应该专门给hash有关的词条搞个汇总了),一般Java中都是在容量到达0.72的时候进行rehash。re-,重来,rehash,就是重写个hashtable咯。要求新的hashtable容量更大,原来那个hashtable里的数据也要迁移过来,但是不能直接对应挪窝,否则新的hashtable后半截岂不空了嘛,于是又要搞一个新的hash,把原来hashtable里面的每个数据都取出来,再用新hash计算一遍存到新hashtable里面,保证新hashtable存储的数据是分散的。

 

 
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    C# .net HashTable

    - `HashTable` vs `Dictionary&lt;TKey, TValue&gt;`:`Dictionary`在.NET Framework 2.0引入,它提供了泛型支持,键和值都为特定类型,更安全且性能稍优。 - `HashTable` vs `ConcurrentDictionary&lt;TKey, TValue&gt;`:`...

    APR教程,中英文二合一

    ### HashTable APR包含了一个哈希表实现,`apr_hash_t`,这是一个键值对存储的数据结构,用于快速查找和存储数据。它提供了插入、删除、遍历和查找元素的方法,适用于构建缓存或存储配置信息。 ### 英文教程 提供...

    较常见的J2EE面试题(附答案)

    - **java.lang.Thread(T)**:表示`java.lang.Thread`类可以继承自一个类,实际上它继承自`java.lang.Object`。 - **java.lang.Number(T)**:同样,`java.lang.Number`类也仅能继承自一个类。 - **java.lang.Double(F...

    Java面试题1

    - `Math.round(-11.5)` 返回 `(long)-11`,对于负数同样遵循上述规则,即中间值(如 -.5)向下取整。 #### 4. abstract class 与 interface 的区别 - **abstract class**: - 它是一种不完整的类,不允许直接实例...

    java 面试 笔试题集

    - **Java.lang.Thread**: 可被继承 (T)。`Thread` 类允许子类覆盖其方法来实现线程的具体行为。 - **java.lang.Number**: 可被继承 (T)。`Number` 是一个抽象类,它提供了数值类型的基本结构,可以被继承以实现具体...

    HashTable排序.txt

    Map.Entry[] set = getSortedHashtable(t); // propertyTable for (int i = 0; i &lt; set.length; i++) { System.out.println(set[i].getKey().toString()); System.out.println(set[i].getValue().toString()); } `...

    WinFormHashTable最简单用法,.net hashtable ,hashtable ,hashtable用法

    - **替代方案**:.NET Framework 2.0之后,推荐使用`Dictionary&lt;TKey, TValue&gt;`类,它提供了更丰富的功能和更好的性能。 6. **示例代码** 下面是一个简单的WinForm应用中使用Hashtable的例子: ```csharp ...

    C# json 转hashtable

    然而,随着.NET Framework的发展,`Dictionary&lt;TKey, TValue&gt;`逐渐取代了`Hashtable`,因为后者不支持泛型,且不遵循.NET Framework的线程安全策略。 标题"**C# json 转 hashtable**"涉及到的主要知识点是将JSON...

    码出八股文-斩出offer线.pdf

    - 泛型类、泛型方法和通配符(如 &lt;? extends T&gt;)是泛型的主要应用场景,可以实现泛型擦除,提高运行时效率。 这些知识点是 Java 面试中常见的八股文题目,理解并掌握它们对于提升面试表现和实际编程能力都至关...

    Hashtable.rar

    对比其他数据结构,如`Dictionary&lt;TKey, TValue&gt;`,`Dictionary`在.NET 2.0及以后版本中引入,它更现代、更快,并且支持泛型。`Dictionary`在大多数情况下比`Hashtable`性能更好,因为它使用了更好的哈希算法,同时...

    C#中的集合示例(Array,ArrayList,Hashtable,List)

    本篇文章将深入探讨三种常见的集合类型:Array、ArrayList、Hashtable以及泛型的List&lt;T&gt;,并提供相关的示例代码来帮助理解它们的用法。 ### 1. Array(数组) 数组是最基础的集合类型,它允许存储相同类型的元素...

    最新java,j2ee面试题

    - `java.lang.Thread`: 可以被继承 (`T`)。 - `java.lang.Number`: 不可以被继承 (`F`)。 - `java.lang.Double`: 不可以被继承 (`F`)。 - `java.lang.Math`: 不可以被继承 (`F`)。 - `java.lang.Void`: 不可以...

    C++数据结构实现之HashTable.zip

    - `std::unordered_map, T&gt;`:键值对映射,Key是唯一标识,T是对应的值。 - `std::unordered_set&lt;T&gt;`:仅存储键,不关联任何值。 这两个容器都支持迭代器,可以方便地遍历其中的所有元素。例如: ```cpp #include ...

    J2EE面试题集(附答案)

    - `HashTable`通过节点的关键码确定节点的存储位置,即给定节点的关键码`k`,通过一定的函数关系`H`(散列函数),得到函数值`H(k)`,将此值解释为该节点的存储地址。 - `HashMap`是非线程安全的,可以接受键和值为`...

    J2EE面试集

    - `java.lang.Thread`:可以实例化(T) - `java.lang.Number`:不可以实例化(F),因为它是抽象类。 - `java.lang.Double`:不可以实例化(F),应该使用其包装类型或基本类型。 - `java.lang.Math`:不可以实例化...

    1C#HASHTABLE排序.pdf

    此外,如果你需要更高效且有序的集合,可以考虑使用`SortedDictionary&lt;TKey, TValue&gt;`,它提供了基于键的排序,或者使用`List&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;`并自定义排序方法。 在实际开发中,选择合适的数据结构和...

    C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    或者,可以使用`SortedList`或`Dictionary&lt;TKey, TValue&gt;`,它们提供有序的键值对存储。 总之,C#中的`HashTable`是一个强大且灵活的数据结构,适用于需要快速查找和管理键值对的场景。理解和熟练运用哈希表的特性...

    c#重写HashTable

    然而,随着.NET Framework的不断发展,`HashTable`逐渐被更安全、类型安全且性能更高的`Dictionary&lt;TKey, TValue&gt;`所取代。尽管如此,有时我们仍然需要对`HashTable`进行重写,以满足特定的需求或优化性能。以下将...

Global site tag (gtag.js) - Google Analytics