- 浏览: 10001 次
刚开始听说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存储的数据是分散的。
发表评论
-
JAVA线程3同步Synchronization(参考官方)
2015-05-03 20:27 7533.1Synchronization 线程之间的交流主要 ... -
JAVA线程对象2.5:使用2-5中方法的简单线程例子(参考官方)
2015-04-28 23:56 637下面的例子SimpleThreads中用到了2-5节中的几 ... -
JAVA线程对象2.4:join方法(参考官方)
2015-04-27 00:24 345Join方法 两个线程AB一起吃午饭,吃啊吃啊,A ... -
JAVA线程对象2.3:interrupt方法(参考官方)
2015-04-25 10:12 659线程中断 interrupt方法作用是告知线程停止手头的 ... -
JAVA线程对象2.2:sleep方法(参考官方)
2015-04-23 20:52 380sleep暂停线程 thread.sleep方法可 ... -
JAVA线程对象2.1:定义和启动线程的两种方式(参考官方)
2015-04-22 15:34 448创建线程实例有两种方式: 1.Runnable ... -
String的特别之处1
2015-04-02 12:11 358【西口西】在Java中,感觉String是个很特别的存 ... -
一起来范二
2015-03-16 17:28 26720150314 Android 抄了一段manife ... -
欧。。写数据结构也是醉了
2014-10-05 18:45 448从哈弗曼压缩看数据结构 数据结构指的是数据的 ... -
通信..举了个例子
2014-09-03 14:07 491整个通信过程可以比 ... -
JAVA线程与进程1(参考官方)
2015-04-21 21:06 334进程 进程拥有独立的执行环境。一个进程通常有一 ... -
数据链表
2014-07-29 10:39 350链表 在链表中,逻辑顺序是通过指针实现的。 ... -
数组队列
2014-07-29 10:39 436数组队列 数组有固定的长度,里面放置的数据也都是固 ... -
接口,抽象类与事件
2014-07-14 12:39 395一、接口 接口是一类特殊的父类,它没有属性、构造方法和普通 ... -
简单画图板
2014-07-03 20:23 576制作一个简单画图板 简单的画图板,能够在窗口中通过鼠标 ... -
数据类型
2014-07-02 12:03 320java的数据类型只有两种,分别是原始类型和引用数据类型(对 ... -
类的继承
2014-06-27 10:26 2871.继承的作用 提高代码重用性, ... -
属性和方法
2014-06-27 09:57 281属性: 定义属性的格式 ... -
类和对象
2014-06-24 13:37 351一、 对象:每个事物都是一个对象。 每个对 ...
相关推荐
- `HashTable` vs `Dictionary<TKey, TValue>`:`Dictionary`在.NET Framework 2.0引入,它提供了泛型支持,键和值都为特定类型,更安全且性能稍优。 - `HashTable` vs `ConcurrentDictionary<TKey, TValue>`:`...
### HashTable APR包含了一个哈希表实现,`apr_hash_t`,这是一个键值对存储的数据结构,用于快速查找和存储数据。它提供了插入、删除、遍历和查找元素的方法,适用于构建缓存或存储配置信息。 ### 英文教程 提供...
- **java.lang.Thread(T)**:表示`java.lang.Thread`类可以继承自一个类,实际上它继承自`java.lang.Object`。 - **java.lang.Number(T)**:同样,`java.lang.Number`类也仅能继承自一个类。 - **java.lang.Double(F...
- `Math.round(-11.5)` 返回 `(long)-11`,对于负数同样遵循上述规则,即中间值(如 -.5)向下取整。 #### 4. abstract class 与 interface 的区别 - **abstract class**: - 它是一种不完整的类,不允许直接实例...
- **Java.lang.Thread**: 可被继承 (T)。`Thread` 类允许子类覆盖其方法来实现线程的具体行为。 - **java.lang.Number**: 可被继承 (T)。`Number` 是一个抽象类,它提供了数值类型的基本结构,可以被继承以实现具体...
Map.Entry[] set = getSortedHashtable(t); // propertyTable for (int i = 0; i < set.length; i++) { System.out.println(set[i].getKey().toString()); System.out.println(set[i].getValue().toString()); } `...
- **替代方案**:.NET Framework 2.0之后,推荐使用`Dictionary<TKey, TValue>`类,它提供了更丰富的功能和更好的性能。 6. **示例代码** 下面是一个简单的WinForm应用中使用Hashtable的例子: ```csharp ...
然而,随着.NET Framework的发展,`Dictionary<TKey, TValue>`逐渐取代了`Hashtable`,因为后者不支持泛型,且不遵循.NET Framework的线程安全策略。 标题"**C# json 转 hashtable**"涉及到的主要知识点是将JSON...
- 泛型类、泛型方法和通配符(如 <? extends T>)是泛型的主要应用场景,可以实现泛型擦除,提高运行时效率。 这些知识点是 Java 面试中常见的八股文题目,理解并掌握它们对于提升面试表现和实际编程能力都至关...
对比其他数据结构,如`Dictionary<TKey, TValue>`,`Dictionary`在.NET 2.0及以后版本中引入,它更现代、更快,并且支持泛型。`Dictionary`在大多数情况下比`Hashtable`性能更好,因为它使用了更好的哈希算法,同时...
本篇文章将深入探讨三种常见的集合类型:Array、ArrayList、Hashtable以及泛型的List<T>,并提供相关的示例代码来帮助理解它们的用法。 ### 1. Array(数组) 数组是最基础的集合类型,它允许存储相同类型的元素...
- `java.lang.Thread`: 可以被继承 (`T`)。 - `java.lang.Number`: 不可以被继承 (`F`)。 - `java.lang.Double`: 不可以被继承 (`F`)。 - `java.lang.Math`: 不可以被继承 (`F`)。 - `java.lang.Void`: 不可以...
- `std::unordered_map, T>`:键值对映射,Key是唯一标识,T是对应的值。 - `std::unordered_set<T>`:仅存储键,不关联任何值。 这两个容器都支持迭代器,可以方便地遍历其中的所有元素。例如: ```cpp #include ...
- `HashTable`通过节点的关键码确定节点的存储位置,即给定节点的关键码`k`,通过一定的函数关系`H`(散列函数),得到函数值`H(k)`,将此值解释为该节点的存储地址。 - `HashMap`是非线程安全的,可以接受键和值为`...
- `java.lang.Thread`:可以实例化(T) - `java.lang.Number`:不可以实例化(F),因为它是抽象类。 - `java.lang.Double`:不可以实例化(F),应该使用其包装类型或基本类型。 - `java.lang.Math`:不可以实例化...
此外,如果你需要更高效且有序的集合,可以考虑使用`SortedDictionary<TKey, TValue>`,它提供了基于键的排序,或者使用`List<KeyValuePair<TKey, TValue>>`并自定义排序方法。 在实际开发中,选择合适的数据结构和...
或者,可以使用`SortedList`或`Dictionary<TKey, TValue>`,它们提供有序的键值对存储。 总之,C#中的`HashTable`是一个强大且灵活的数据结构,适用于需要快速查找和管理键值对的场景。理解和熟练运用哈希表的特性...
然而,随着.NET Framework的不断发展,`HashTable`逐渐被更安全、类型安全且性能更高的`Dictionary<TKey, TValue>`所取代。尽管如此,有时我们仍然需要对`HashTable`进行重写,以满足特定的需求或优化性能。以下将...