`
anzitlan10
  • 浏览: 19092 次
  • 性别: 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_学习资料

    本文主要探讨了几个常用的集合类,包括Array、ArrayList、List、Hashtable、Dictionary, TValue&gt;、Stack和Queue,以及它们的特点和应用场景。 1. **数组**(Array):数组是最基本的数据结构,它是一个固定大小的...

    c#数据结构之array,arraylist,hashtable,dictionary

    C#数据结构之Array、ArrayList、Hashtable、Dictionary C#中有多种数据结构可以用来存储和管理数据,今天我们将讨论四种常用的数据结构:Array、ArrayList、Hashtable和Dictionary。这些数据结构都是_Collections_...

    C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解

    本文将介绍 C# 中的 ArrayList、HashSet、HashTable、List、Dictionary 等集合类的区别和应用场景。 ArrayList 是一个可变长数组,可以将任意多的数据添加到 ArrayList 中。其内部维护的数组,当长度不足时,会自动...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    C# 集合类的各个详细的介绍

    - List&lt;T&gt; 是泛型集合类,继承自`System.Collections.Generic.List&lt;T&gt;`,它比ArrayList更安全,因为T代表了存储元素的具体类型。 - List同样支持通过索引访问,例如`List&lt;int&gt; list = new List(); list[0] = 1;`。...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...

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

    与ArrayList相比,List更加安全,因为它在编译时就知道了元素的类型。以下是一个List的示例: ```csharp List&lt;int&gt; numbersList = new List&lt;int&gt; { 1, 2, 3, 4, 5 }; numbersList.Add(6); // 添加元素 int first...

    Arraylist、Hashtable、Vector

    至于Hashtable,它是一个过时的类,现在通常推荐使用HashMap来替代,因为HashMap提供了更好的性能,尽管它不是线程安全的。如果需要线程安全的哈希表,可以使用ConcurrentHashMap,这是Java并发编程库中的一个类,它...

    Java集合多线程安全.docx

    然而,并非所有集合类都是线程安全的,这在多线程环境中可能导致数据不一致或者运行时异常。线程安全指的是一个对象在多线程环境下可以被正确地访问和修改,而不会出现竞态条件或死锁等问题。 线程不安全的集合类...

    C#集合的概念

    System.Collections命名空间提供了多种集合类,如ArrayList、Stack、Queue、Hashtable等,它们各自有不同的功能和用途。然而,这些非泛型集合在处理不同类型的数据时可能会导致类型转换开销,并且在安全性上不如泛型...

    arraylist Hashtable

    ArrayList 和 Hashtable 是 Java 编程语言中两种非常重要的集合类,它们都属于 Java Collection Framework 的一部分,用于存储和管理对象。下面将详细讲解这两个数据结构的特性、使用场景以及相关操作。 ArrayList ...

    C#个人通讯录,分别用了ArrayList、HashTable、XML、Access、TXT实现

    HashTable是另一种集合类,它使用哈希表来存储键值对。在这个通讯录应用中,HashTable可能用于通过姓名或其他唯一标识快速查找联系人信息。由于HashTable基于哈希算法,它的查找速度通常比ArrayList快,但插入和删除...

    详解如何选择使用ArrayList、HashTable、List、Dictionary数组

    在.NET框架中,选择合适的集合类对于提升代码的性能和可读性至关重要。本文将深入探讨ArrayList、HashTable、List、Dictionary,T&gt;以及其他的集合类型,帮助开发者理解它们的特点和适用场景。 首先,ArrayList作为...

    数组和集合对象(二) Hashtable练习

    在C#编程语言中,数组和集合对象是两种常见的数据结构,它们用于存储和管理一组相关的数据。本篇文章将重点讨论`Hashtable`类的使用,它是一个非同步的、键值对存储的集合,适用于存储不重复的键,并且允许快速访问...

    C# 集合的索引性能比较

    其次,List是.NET Framework 2.0引入的泛型集合,它是ArrayList的替代品,提供了更好的类型安全性和性能。List同样提供了O(1)的索引访问,由于其泛型特性,避免了装箱和拆箱操作,提高了性能。在大多数情况下,List...

    C#6大集合类全面解析

    本文将详细介绍C#中的六大集合类:`ArrayList`、`Stack`、`Queue`、`Hashtable`、`SortedList`以及`NameValueCollection`。 #### 二、数组的不足与集合的优势 在深入探讨这六种集合类之前,我们首先来看一下数组的...

    Java集合类详解总结

    #### Vector与ArrayList的线程安全性 `Vector`通过内部同步机制确保线程安全,而`ArrayList`则不是线程安全的。在多线程环境中使用`ArrayList`时,可以通过`Collections.synchronizedList`将其包装成线程安全的形式...

    java常用集合类总结

    在线程安全的集合类中,Vector、Stack、Hashtable和Enumeration等类都是线程安全的,但性能较低,重量级的。这些类都是JDK1.1中引入的旧式集合类,现在已经被新的集合类所取代。 Java集合类提供了多种方式来存储和...

    C#集合容器(collection)详解

    - **System.Collections.Specialized**:提供了特定用途的集合类,如`LinkedListDictionary`、`BitVector32`等。 #### 四、ArrayList详解 `ArrayList`是C#中最常用的集合之一,它结合了数组和集合的优点,支持动态...

Global site tag (gtag.js) - Google Analytics