Hashtable

ArrayList集合是有缺点的:下标不可靠。因为元素的下标随时都有可能会发生变化。当删除或者插入的时候,下标就会发生变化。将数据存储进去以后,我们就没有那么容易找到指定的元素。

一、Hashtable  集合
     1、可以存储多个数据,并且长度动态增长。
     2、哈希表集合是以键值对的方式来存储数据的。
     3、与ArrayList不同的是,哈希表要求存储数据的时候,要为每一个数据取1个别名。通过这个别名快速的找到对应的值。这种存储方式我们叫做键值对的存储。
     键:就是为存储的值取得别名  Key
     值:就是真正存储的数据  Value  
 
  Hashtable 是FCL中的一个类,命名空间System.Collections  要使用它的话,首先也得创建1个对象。哈希表的元素是由一个键和一个值组成的。键是object类型的。
 
二、新增数据
      Add()方法  要求同时传入键和值。在新增的时候必须要为值取1个别名。键是用来区分值的,所以键不能重复。
 
三、取出哈希表中的元素的值
      通过键取出这个键对应的值。在索引器中传入键,就可以通过键取得对应的值
      
四、改已经存在的元素的值
      已经存在的键值对,键是不能更改的,能更改的是这个键对应的值。
      a、要确定改那1个值,通过key确定值。
          通过索引器中传入key来确定值,重新赋值就可以了。
      b、通过索引器传入key为对应的value重新赋值的时候,如果key不存在,则会做新增的操作。
 
五、删除键值对
      Remove()方法,传入一个键,就会把这个键对应的键值对一起删除。如果键不存在,不会报错。
      Clear() 方法,将集合中所有的键值对清空。
 
六、遍历
      a、for循环遍历肯定是不靠谱的了,因为遍历出来的是0---Count-1 企图把它当下标,而系统却把它当作key。
      b、哈希表中的每一个元素的类型是1个DictionaryEntry结构体对象,把key和value存储在这个结构体对象中的字段中(这个说法不完善)。
     foreach(DictionaryEntry item  in  table)
   {
           item.key  取出当前变量中的键值对的键
           item.Value  取出当前变量中的键值对的值
   }
     c、哈希表对象的keys属性中存储了哈希表中的所有的键,所以我们只需要遍历哈希表的keys属性,就可以取到所有的key,通过key自然就可以取值了。
          foreach (object key  in  table.keys)
        {
                  就可以取出所有的key,通过key就可以取出对应的值。
                  table[key]
        }
     d、哈希表对象的Values属性中,存储了哈希表中的所有的值,所以我们只需要遍历这个属性就可以直接得到所有的值了。
          foreach (object value in  table.Values)
        {
                  value  就是每一个值
        }
      总结:如果我们希望得到每一个键值,使用第一种和第二种。如果只需要得到值,使用第三种。
    我们发现往哈希表中存储数据的时候,这些键值对并不是按照顺序依次存储在其中的,看起来好像是乱七八糟的。每次往哈希表中新增键值对的时候,会根据键做1个哈希算法,算出1个下标,然后将这个键值对存储在该下标处。在取值的时候,我们取值是根据key去取值的,也会根据这个key算出下标 直接到该下标出取值。
     和ArrayList比:
     a、ArrayList 存数据是一次的挨个的存储在其中。
         Hashtable 是根据key算出1个下标,并将其存储在其中。
     b、Hashtable在存储数据的时候,效率确实要比ArrayList要慢。但是在取值的时候,Hashtable肯定比ArrayList快。
 
posted @ 2015-08-24 23:25  Chen_Weifeng  阅读(228)  评论(0编辑  收藏  举报