`
anzitlan10
  • 浏览: 18588 次
  • 性别: Icon_minigender_1
  • 来自: 柳州
社区版块
存档分类
最新评论

C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全

    博客分类:
  • .net
阅读更多
HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。

HashTable的应用场合有:做对象缓存,树递归算法的替代,和各种需提升效率的场合。

    //Hashtable sample
    System.Collections.Hashtable ht = new System.Collections.Hashtable();

    //--Be careful: Keys can't be duplicated, and can't be null----
    ht.Add(1, "apple");
    ht.Add(2, "banana");
    ht.Add(3, "orange");
   
    //Modify item value:
    if(ht.ContainsKey(1))
        ht[1] = "appleBad";

    //The following code will return null oValue, no exception
    object oValue = ht[5]; 
   
    //traversal 1:
    foreach (DictionaryEntry de in ht)
    {
        Console.WriteLine(de.Key);
        Console.WriteLine(de.Value);
    }

    //traversal 2:
    System.Collections.IDictionaryEnumerator d = ht.GetEnumerator();
    while (d.MoveNext())
    {
        Console.WriteLine("key:{0} value:{1}", d.Entry.Key, d.Entry.Value);
    }

    //Clear items
    ht.Clear();

Dictionary和HashTable内部实现差不多,但前者无需装箱拆箱操作,效率略高一点。


    //Dictionary sample
    System.Collections.Generic.Dictionary<int, string> fruits =
        new System.Collections.Generic.Dictionary<int, string>();

    fruits.Add(1, "apple");
    fruits.Add(2, "banana");
    fruits.Add(3, "orange");

    foreach (int i in fruits.Keys)
    {
        Console.WriteLine("key:{0} value:{1}", i, fruits);
    }

    if (fruits.ContainsKey(1))
    {
        Console.WriteLine("contain this key.");
    }


ArrayList是一维变长数组,内部值为object类型,效率一般:




    //ArrayList
    System.Collections.ArrayList list = new System.Collections.ArrayList();
    list.Add(1);//object type
    list.Add(2);
    for (int i = 0; i < list.Count; i++)
    {
        Console.WriteLine(list[i]);
    }


HashTable是经过优化的,访问下标的对象先散列过,所以内部是无序散列的,保证了高效率,也就是说,其输出不是按照开始加入的顺序,而Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同。如果一定要排序HashTable输出,只能自己实现:



    //Hashtable sorting
    System.Collections.ArrayList akeys = new System.Collections.ArrayList(ht.Keys); //from Hashtable
    akeys.Sort(); //Sort by leading letter
    foreach (string skey in akeys)
    {
        Console.Write(skey + ":");
        Console.WriteLine(ht[skey]);
    }
 

HashTable与线程安全:

为了保证在多线程的情况下的线程同步访问安全,微软提供了自动线程同步的HashTable:


如果 HashTable要允许并发读但只能一个线程写, 要这么创建 HashTable实例:


    //Thread safe HashTable
    System.Collections.Hashtable htSyn = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
这样, 如果有多个线程并发的企图写HashTable里面的 item, 则同一时刻只能有一个线程写, 其余阻塞; 对读的线程则不受影响。

 

另外一种方法就是使用lock语句,但要lock的不是HashTable,而是其SyncRoot;虽然不推荐这种方法,但效果一样的,因为源代码就是这样实现的:

//Thread safeprivate static System.Collections.Hashtable htCache = new System.Collections.Hashtable (); public static void AccessCache (){    lock ( htCache.SyncRoot )    {        htCache.Add ( "key", "value" );         //Be careful: don't use foreach to operation on the whole collection        //Otherwise the collection won't be locked correctly even though indicated locked        //--by MSDN    }}  //Is equivalent to 等同于 (lock is equivalent to Monitor.Enter and Exit()public static void AccessCache (){    System.Threading.Monitor.Enter ( htCache.SyncRoot );     try    {        /* critical section */        htCache.Add ( "key", "value" );         //Be careful: don't use foreach to operation on the whole collection        //Otherwise the collection won't be locked correctly even though indicated locked        //--by MSDN    }    finally    {        System.Threading.Monitor.Exit ( htCache.SyncRoot );    }}
分享到:
评论

相关推荐

    C#_集合类_Array,Arraylist,List,Hashtable,Dictionary,Stack,Queue_学习资料

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类。我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据...

    C#6大集合类全面解析

    C#6大集合类:1.ArrayList类2.Stack类3.Queue类4.Hashtable类5.SortedList类6.NameValueCollection类。

    C#常见的几种集合 ArrayList,Hashtable,ListT,DictionaryK,V 遍历方法对比

    一、先来分别介绍一下ArrayList,Hashtable,List,Dictionary 1.ArrayList动态数组,保存值的时候比较好用 2.Hashtable以存储键值对的方式存储。value,和key 3.List&lt;T&gt; 和 Dictionary&lt;K&gt; 应该是泛型吧,可以保存...

    C#泛型Dictionary的用法实例详解

    泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。 很多非泛型集合...

    序列化Hashtable

     那先来看一个可以正常序列化的集合类――Arraylist:serialize = new XmlSerializer(typeof(ArrayList));在序列化过程中临时生成的文件中可以发现如下的语句: WriteStartElement(@&quot;ArrayOfAnyType&quot;, @&...

    Java集合框架完整说明便于了解集合

    Comparator的区别,List和Set集合详解,List和Set的总结,HashMap和HashTable的⽐较,Map的遍历,ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?HashSet与TreeSet与LinkedHashSet对⽐,HashMap 的⻓...

    电信面试题

    备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。...

    Collections in C#

    集合,C#中包括一系列的类,它提供了一个优越的方式阵列功能,如何: ArrayList List HashTable Dictionary SortedList Stack Queue

    JAVA集合类的一些总结

    JAVA集合类的一些总结 collection,vector,arraylist,list,hashtable...

    (数据结构与算法:C#语言描述(英文)

    在.NET 框架库中包含有一套数据结构类(也称为集合类)。这套类的范围从Array 类、ArrayList 类和Collection 类到Stack类和Queue 类,再到Hashtable 类和SortedList 类。学习数据结构与算法的学生在学习如何实现它们...

    集合类Array List HashTable实例操作练习

    集合常用操作添加、遍历、移除;本文将详细介绍下ArrayList对值类型的操作/ArrayList对引用类型的操作及HashTable的使用,感兴趣的你可不要错过了哈

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 ...Java集合详解8:Java集合类细节精讲 JavaWeb

    实验05 Java集合.doc

    4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 ...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    10.2.1 arraylist集合类 185 10.2.2 queue集合类 187 10.2.3 stack集合类 188 10.2.4 hashtable集合类 189 10.2.5 sortedlist集合类 190 10.2.6 使用集合初始化器 191 10.2.7 比较数组和集合 192 10.2.8 使用...

    Java工程师面试复习指南

    Java集合类总结 Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解...

    c#学习方法

    5. 深入学习集合特性:索引器、自定义集合、深入刨析集合类型本质(ArrayList、HashTable)、学习泛型集合、泛型约束等。6. 学习委托与事件:委托与事件的区别、匿名方法、Lambda表达式。7. 正则表达式。8. 查询表达式...

    Java 最常见的 208 道面试题:第二模块答案

    Java 最常见的 208 道面试题:第二模块答案 18. java 容器都有哪些?...30. 哪些集合类是线程安全的? 31. 迭代器 Iterator 是什么? 32. Iterator 怎么使用?有什么特点? 33. Iterator 和 ListIterator 有什么区别?

    dyArithmetic.zip

    在.NET 框架库中包 含有一套数据结构类(也称为集合类)。这套类的范围从 Array 类、ArrayList 类和Collection 类到Stack 类和Queue 类,再到 Hashtable 类和 SortedList 类。学习数据结构与算法的学生在学习如何...

Global site tag (gtag.js) - Google Analytics