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快。