hashtable 订阅
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 展开全文
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
信息
作    用
直接进行访问的数据结构
别    名
散列表
中文名
哈希表
外文名
Hash table
哈希表基本概念
收起全文
精华内容
下载资源
问答
  • Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对 <BR><BR>在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value); 在哈希表中去除某个key/value键值对:...
  • (多选)有关hashMap跟hashTable的区别,说法正确的是? A. HashMap和Hashtable都实现了Map接口 B. HashMap是非synchronized,而Hashtable是synchronized C. HashTable使用Enumeration,HashMap使用Iterator D. ...
  • 我们只需要在其基础上再封装一些HashTable的函数,就能够得到一个精简版的哈希表。 加入函数如下: 函数名 说明 返回值 add(key,value) 添加项 无 getValue(key) 根据key取值 object remove(k
  • 主要介绍了C#使用foreach遍历哈希表(hashtable)的方法,是C#中foreach语句遍历散列表的典型应用,非常具有实用价值,需要的朋友可以参考下
  • HashTable

    2019-12-01 19:13:21
    HashTable是线程安全的,因为几乎所有的public方法都是synchronized的 Hashtable也是一个散列表,它存储的内容是键值对。基于Dictionary类 存储数据: 首先判断value是否为空,为空则抛出异常;计算key的hash值,并...

    参考:https://blog.csdn.net/qq_33206732/article/details/80338354

    HashTable是线程安全的,因为几乎所有的public方法都是synchronized的

    1. Hashtable也是一个散列表,它存储的内容是键值对。基于Dictionary类
    2. 存储数据: 首先判断value是否为空,为空则抛出异常;计算key的hash值,并根据hash值获得key在table数组中的位置index,如果table[index]元素不为空,则进行迭代,如果遇到相同的key,则直接替换,并返回旧value;否则,我们可以将其插入到table[index]位置。
    3. key和value都不允许为null,Hashtable遇到null,直接返回NullPointerException。
    4. 较HashMap速度慢

    Hashtable

    和HashMap一样,Hashtable也是一个散列表,它存储的内容是键值对。默认容量为11,装载因子为0.75

       public Hashtable() {
            this(11, 0.75f);
        }

     

    成员变量

    Hashtable是通过”拉链法”实现的哈希表。它包括几个重要的成员变量:table, count, threshold, loadFactor, modCount。

    table:是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的。
    count:是Hashtable的大小,它是Hashtable保存的键值对的数量。
    threshold:是Hashtable的阈值,用于判断是否需要调整Hashtable的容量。threshold的值=”容量*加载因子”。
    loadFactor:就是加载因子。
    modCount:是用来实现fail-fast机制的(用于防止在读取过程中,有更新操作,如果有更新操,该参数会修改,然后读取操作会报错)。

    构造方法
    Hashtable一共提供了4个构造方法:

    public Hashtable(int initialCapacity, float loadFactor): 用指定初始容量和指定加载因子构造一个新的空哈希表。useAltHashing为boolean,其如果为真,则执行另一散列的字符串键,以减少由于弱哈希计算导致的哈希冲突的发生。
    public Hashtable(int initialCapacity):用指定初始容量和默认的加载因子 (0.75) 构造一个新的空哈希表。
    public Hashtable():默认构造函数,容量为11,加载因子为0.75。
    public Hashtable(Map<? extends K, ? extends V> t):构造一个与给定的 Map 具有相同映射关系的新哈希表。

    其存储数据流程如下:
    1.判断value是否为空,为空则抛出异常;
    2.计算key的hash值,并根据hash值获得key在table数组中的位置index,如果table[index]元素不为空,则进行迭代,如果遇到相同的key,则直接替换,并返回旧value;
    3.否则,我们可以将其插入到table[index]位置。

    从上面可以看出,其存储流程和HashMap相似。

    获取数据

    相比较于put方法,get方法则简单很多。其过程就是首先通过hash()方法求得key的哈希值,然后根据hash值得到index索引(上述两步所用的算法与put方法都相同)。然后迭代链表,返回匹配的key的对应的value;找不到则返回null。

    HashTable源码:

     

    public class Hashtable<K,V>
        extends Dictionary<K,V>
        implements Map<K,V>, Cloneable, java.io.Serializable {
    。。。。。
    }
    
     public synchronized V put(K key, V value) {
            // Make sure the value is not null
            if (value == null) {
                throw new NullPointerException();
            }
    
            // Makes sure the key is not already in the hashtable.
            Entry tab[] = table;
            int hash = hash(key);
            int index = (hash & 0x7FFFFFFF) % tab.length;
            for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
                if ((e.hash == hash) && e.key.equals(key)) {
                    V old = e.value;
                    e.value = value;
                    return old;
                }
            }
    
            modCount++;
            if (count >= threshold) {
                // Rehash the table if the threshold is exceeded
                rehash();
    
                tab = table;
                hash = hash(key);
                index = (hash & 0x7FFFFFFF) % tab.length;
            }
    
            // Creates the new entry.
            Entry<K,V> e = tab[index];
            tab[index] = new Entry<>(hash, key, value, e);
            count++;
            return null;
        }
    
        /**
         * Removes the key (and its corresponding value) from this
         * hashtable. This method does nothing if the key is not in the hashtable.
         *
         * @param   key   the key that needs to be removed
         * @return  the value to which the key had been mapped in this hashtable,
         *          or <code>null</code> if the key did not have a mapping
         * @throws  NullPointerException  if the key is <code>null</code>
         */
        public synchronized V remove(Object key) {
            Entry tab[] = table;
            int hash = hash(key);
            int index = (hash & 0x7FFFFFFF) % tab.length;
            for (Entry<K,V> e = tab[index], prev = null ; e != null ; prev = e, e = e.next) {
                if ((e.hash == hash) && e.key.equals(key)) {
                    modCount++;
                    if (prev != null) {
                        prev.next = e.next;
                    } else {
                        tab[index] = e.next;
                    }
                    count--;
                    V oldValue = e.value;
                    e.value = null;
                    return oldValue;
                }
            }
            return null;
        }
    

     

    实例:

    Hashtable table = new Hashtable();
    18         // 添加操作
    19         table.put("one", r.nextInt(10));
    20         table.put("two", r.nextInt(10));
    21         table.put("three", r.nextInt(10));
    22 
    23         // 打印出table
    24         System.out.println("table:"+table );
    25 
    26         // 通过Iterator遍历key-value
    27         Iterator iter = table.entrySet().iterator();
    28         while(iter.hasNext()) {
    29             Map.Entry entry = (Map.Entry)iter.next();
    30             System.out.println("next : "+ entry.getKey() +" - "+entry.getValue());
    31         }

     

    内部Entry类:

       private static class Entry<K,V> implements Map.Entry<K,V> {
            int hash;
            final K key;
            V value;
            Entry<K,V> next;
    
            protected Entry(int hash, K key, V value, Entry<K,V> next) {
                this.hash = hash;
                this.key =  key;
                this.value = value;
                this.next = next;
            }

     

     

    展开全文
  • 主要介绍了C#将HashTable中键列表或值列表复制到一维数组中方法,涉及C#操作HashTable的相关技巧,需要的朋友可以参考下
  • 主要介绍了C#中哈希表(HashTable)用法,简单讲述了哈希表的原理并结合实例形式详细分析了C#针对哈希表进行添加、移除、判断、遍历、排序等操作的实现技巧,需要的朋友可以参考下
  • Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,所以Hashtable可以支持任何类型的keyvalue键值对
  • Hashtable

    千次阅读 多人点赞 2021-03-09 21:44:46
    Hashtable Hashtable:线程安全的,不允许null的键或值;是线程安全的,但是Hashtable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁。多...
    Hashtable

    Hashtable:线程安全的,不允许null的键或值;是线程安全的,但是Hashtable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁。多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,相当于将所有的操作串行化,在竞争激烈的并发场景中性能就会非常差

    1、Hashtable不允许null值或者null键,编译时不会报错,但是运行报错。HashMap允许null值或者null键,只是key为null只能一次,value为null没有限制

    2、HashMap的实现上没有同步约束,但是Hashtable的实现方法上有synchronized同步约束,所以说Hashtabe属于一个线程安全的类

    展开全文
  • 主要介绍了C#将hashtable值转换到数组中的方法,涉及C#中CopyTo方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
  • 12 HashTable.rar

    2019-01-22 13:34:32
    严蔚敏数据结构与算法 课本算法实现
  • 利用C语言实现HashTable

    2021-01-20 06:31:08
    HashTable是在实际应用中很重要的一个结构,下面讨论一个简单的实现,虽然简单,但是该有的部分都还是有的。 一,访问接口 创建一个hashtable. hashtable hashtable_new(int size) /其中size表示包含的接点个数。...
  • 以下是对java中ArrayList与Vector的区别以及HashMap与Hashtable的区别进行了详细的解析。需要的朋友可以过来参考下
  • HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。理解了HashTable的数据存储结构,对我们分析...
  • 本文实例讲述了js实现hashtable的赋值、取值、遍历操作。分享给大家供大家参考,具体如下: 哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值、取值、遍历、排序操作提高效率。想起这个东西其实使我们以前...
  • HashMap和HashTable的区别?但是如果想线程安全有想效率高?
  • java hashtable实现代码

    2020-09-04 23:28:34
    介绍了java hashtable实现代码,有需要的朋友可以参考一下
  • ht := hashtable . New () ht . Set ( "user" , "John" ) 获得价值 ht . Get ( "user" ) // John 删除值 ht . Remove ( "user" ) // 1 使用Iter()遍历表 for entry := range ht . Iter () { fmt . Printf ( "key...
  • 今天小编就为大家分享一篇关于HashMap和HashTable底层原理以及常见面试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 主要介绍了java 中遍历取值异常(Hashtable Enumerator)解决办法的相关资料,用迭代器取值时抛出的异常:java.util.NoSuchElementException: Hashtable Enumerator ,需要的朋友可以参考下
  • 集合常用操作添加、遍历、移除;本文将详细介绍下ArrayList对值类型的操作/ArrayList对引用类型的操作及HashTable的使用,感兴趣的你可不要错过了哈
  • asp.net Hashtable自定义实现代码,比较多,大家可以看下,测试。
  • h为Hashtable
  • Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。
  • 本篇文章是对PHP中的HashTable结构进行了详细的分析介绍,需要的朋友参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,920
精华内容 86,368
关键字:

hashtable