HashTable和NameValueCollection的区别示例

HashTable和NameValueCollection的区别示例,HashTable它用得比较广,再然后是KEY的唯一性。用了之后就发现了后果很严重:数据加入哈希表的时候的顺序和迭代输出的顺序不一致,这问题可真严重了,既然哈希表不能满足要求,只能用其它的数据结构了,找了一下就NameValueCollection了,用起来来还真好,主是没有支持KEY的唯一性,不可无所谓了,反正我这个项目也不好要求其唯一性了。    


关于HashTable和NameValueCollection输出顺序对比可通过以下示例得出。
using System;
using System.Collections.Generic;
using System.Collections;
using System.Collections.Specialized;

public class MyClass
{
    public static void Main()
    {
    System.Collections.Hashtable ht = new System.Collections.Hashtable ();
    ht.Add ( "DdpMDisplaySeq".Trim ( ) , "Display Sequence".Trim ( ) );
        ht.Add ( "DdpMNameChi".Trim ( ) , "Name (Chinese)".Trim ( ) );
        ht.Add ( "DdpMNameEng".Trim ( ) , "Name (English)".Trim ( ) );       
        ht.Add ( "Comment".Trim ( ) , "Comment".Trim ( ) );
        ht.Add ( "DdpMMarketCode".Trim ( ) , "Market Code".Trim ( ) );
        foreach ( object key in ht.Keys )
        {
          Console.WriteLine( "{0} {1}    {2},{3}" , key , ht[key] , key.GetHashCode() , ht[key].GetHashCode() );
        }
        NameValueCollection myCol = new NameValueCollection();
        myCol.Add ( "DdpMDisplaySeq".Trim ( ) , "Display Sequence".Trim ( ) );
        myCol.Add ( "DdpMNameChi".Trim ( ) , "Name (Chinese)".Trim ( ) );
        myCol.Add ( "DdpMNameEng".Trim ( ) , "Name (English)".Trim ( ) );       
        myCol.Add ( "Comment".Trim ( ) , "Comment".Trim ( ) );
        myCol.Add ( "DdpMMarketCode".Trim ( ) , "Market Code".Trim ( ) );
        foreach ( string key in myCol.Keys )
        {
          Console.WriteLine( "{0}/{1}" , key , myCol[key] );
        }

        RL();
    }
   
    Helper methods#region Helper methods

    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);   
    }
   
    private static void RL()
    {
        Console.ReadLine();   
    }
   
    private static void Break()
    {
        System.Diagnostics.Debugger.Break();
    }

    #endregion
}
输出结果为:
DdpMDisplaySeq Display Sequence    -1989459343,1288318213
DdpMMarketCode Market Code    1652325269,-2031292722
DdpMNameChi Name (Chinese)    -408135670,-703205071
DdpMNameEng Name (English)    -1570541874,-1899340382
Comment Comment    -498702589,-498702589
DdpMDisplaySeq/Display Sequence
DdpMNameChi/Name (Chinese)
DdpMNameEng/Name (English)
Comment/Comment
DdpMMarketCode/Market Code

 

### 回答1: Hashtable和HashMap都是基于哈希表实现的数据结构,它们的主要区别在于线程安全性和迭代器的遍历方式。 Hashtable是线程安全的,因为它的所有方法都是同步的,但这也导致了它的性能较差。而HashMap则不是线程安全的,但它的性能更好。 另外,Hashtable的迭代器遍历是通过Enumeration实现的,而HashMap的迭代器遍历是通过Iterator实现的。Enumeration只能读取数据,而Iterator可以同时读取和删除数据,因此Iterator更加灵活。 总之,如果需要线程安全的哈希表,可以选择Hashtable;如果需要更好的性能和灵活的迭代器遍历方式,可以选择HashMap。 ### 回答2: Hashtable 和 HashMap 都是常用的哈希表数据结构,它们之间的区别如下: 1. 继承关系:Hashtable 是基于 Dictionary 类的一个旧实现,而 HashMap 是继承自 AbstractMap 类的新实现。 2. 线程安全性:Hashtable 是线程安全的,所有的方法都是同步的,而 HashMap 不是线程安全的。在多线程环境下,如果需要线程安全,可以使用 ConcurrentHashMap。 3. Null 值:Hashtable 不允许键或值为 null,否则会抛出 NullPointerException,而 HashMap 可以允许键或值为 null。 4. 性能:由于 Hashtable 是同步的,所以在多线程环境下,访问 Hashtable 的性能相对较低,而 HashMap 不受同步影响,在单线程环境下,访问 HashMap 的性能较高。 5. 迭代器:迭代器遍历 Hashtable 时,是通过 Enumeration 实现的,而 HashMap 的迭代器是通过 Iterator 实现的。 6. 初始容量和扩容:Hashtable 的初始容量为 11,扩容时增加原容量的一倍加一;HashMap 的初始容量为 16,扩容时增加原容量的一倍。由于 Hashtable 的初始容量较小,在数据量较大时,扩容的次数较多,可能对性能产生一定影响。 综上所述,HashMap 是 Hashtable 的轻量级实现,由于其非线程安全和允许 null 值的特性,更适用于单线程环境或需要高性能的场景。而 Hashtable 则适用于多线程环境下需要线程安全性的场景。 ### 回答3: Hashtable 和 HashMap 都是常见的用于存储和管理键值对的数据结构,它们的主要区别如下: 1. 继承关系:Hashtable 是 Dictionary 类的子类,而 HashMap 是 AbstractMap 类的子类。这意味着 HashMap 可以单独定义其更丰富的功能,而 Hashtable 只能基于 Dictionary 的功能进行操作。 2. 线程安全性:Hashtable 是线程安全的,内部的方法都使用 synchronized 关键字保证了线程安全性,因此适用于多线程环境。而 HashMap 不是线程安全的,如果在多线程环境下使用 HashMap,需要额外考虑线程同步问题。 3. 允许键值为空:HashMap 允许键和值都为空,而 Hashtable 不允许键和值为空,否则会抛出 NullPointerException 异常。 4. 性能:由于 Hashtable 是线程安全的,所以在进行读写操作时会有一定的性能开销。而 HashMap 在单线程环境下的性能要高于 Hashtable。 总的来说,如果在单线程环境下使用,且不需要考虑线程同步问题,则推荐使用 HashMap;如果在多线程环境下使用,或需要保证线程安全性,则可以选择使用 Hashtable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值