C#中HashTable简介和使用用法

C#中HashTable简介和使用用法,第1张

一 简介

名词介绍 散列表(Hash table 也叫哈希表) 是根据关键码值(Key value)而直接进行访问的数据结构 也就是说 它通过把关键码值映射到表中一个位置来访问记录 以加快查找的速度 这个映射函数叫做散列函数 存放记录的数组叫做散列表

HashTable 表的优点 HashTable是System Collections命名空间提供的一个容器 HashTable中的key/value均为object类型 所以HashTable可以支持任何类型的key/value键/值对

HashTable的优点就在于其索引的方式 速度非常快

二 哈希表的简单 *** 作

在哈希表中添加一个keyvalue键值对 HashtableObject Add(key value);

在哈希表中去除某个keyvalue键值对 HashtableObject Remove(key);

从哈希表中移除所有元素 HashtableObject Clear();

判断哈希表是否包含特定键key HashtableObject Contains(key);

下面控制台程序将包含以上所有 *** 作

using System;

using System Collections;       //file使用Hashtable时 必须引入这个命名空间

class hashtable

{

public static void Main()

{

Hashtable ht=new Hashtable();  //file创建一个Hashtable实例

ht Add(E e);                   //添加keyvalue键值对

ht Add(A a);

ht Add(C c);

ht Add(B b);

string s=(string)ht[A];

if(ht Contains(E))             //file判断哈希表是否包含特定键 其返回值为true或false

Console WriteLine(the E keyexist);

ht Remove(C);                 //移除一个keyvalue键值对

Console WriteLine(ht[A]);     //此处输出a

ht Clear();                   //移除所有元素

Console WriteLine(ht[A]);     //file此处将不会有任何输出

}

}

遍历哈希表

遍历哈希表需要用到DictionaryEntry Object 代码如下

for(DictionaryEntry de in ht) // fileht为一个Hashtable实例

{

Console WriteLine(de Key);   //de Key对应于keyvalue键值对key

Console WriteLine(de Value); //de Key对应于keyvalue键值对value

}

四 对哈希表进行排序

对哈希表进行排序在这里的定义是对keyvalue键值对中的key按一定规则重新排列 但是实际上这个定义是不能实现的 因为我们无法直接在Hashtable进行对key进行重新排列 如果需要Hashtable提供某种规则的输出 可以采用一种变通的做法

ArrayList akeys=new ArrayList(ht Keys);  // file别忘了导入System Collections

akeys Sort();                           // file按字母顺序进行排序

for(string skey in akeys)

{

Console Write(skey + );

Console WriteLine(ht[skey]);            // 排序后输出

lishixinzhi/Article/program/net/201311/12422

HashTable在SystemCollections的命名空间下。

是个根据object索引键访问object值的集合。

没有泛型,使用的时候只能进行强制转换。

Dictionary只能通过string类来定义键值,

如Dictionary d;d["wang"]="王";

CollectionBase只能通过数字索引来访问,

如CollectionBase col;col[0]="好";

HashTable比起上述两种类型来说有更强的访问能力。如:

HastTable hs=new HashTable();

hs["wang"]="王";

hs[0]="好";

然而上述两个集合类有泛型类的实现Dictionary<>和List<>,可以实现强类型化。(返回的是自己定制的类型)

HashTable没有泛型类,返回的都是object类型。使用的时候必须进行强制转化。

开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的。需要大家注意,在实际开发中以需求而定。

java为数据结构中的映射定义了一个接口javautilMap,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。

Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力

Hashtable 与 HashMap类似,但是主要有6点不同。

1HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。

3HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。

4HashTable使用Enumeration,HashMap使用Iterator。

5HashTable中hash数组默认大小是11,增加的方式是 old2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6哈希值的使用不同,HashTable直接使用对象的hashCode。

TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

下面是HashTable,HashMap和TreeMap总结的一个经典例子。

package comtaobaoluxiaoting;

import javautilMap;

import javautilHashMap;

import javautilSet;

import javautilHashSet;

import javautilIterator;

import javautilHashtable;

import javautilTreeMap;

class HashMaps

{

public static void main(String[] args)

{

Map map=new HashMap();

mapput(“a”, “aaa”);

mapput(“b”, “bbb”);

mapput(“c”, “ccc”);

mapput(“d”, “ddd”);

Iterator iterator = mapkeySet()iterator();

while (iteratorhasNext()) {

Object key = iteratornext();

Systemoutprintln(“mapget(key) is :”+mapget(key));

}

Hashtable tab=new Hashtable();

tabput(“a”, “aaa”);

tabput(“b”, “bbb”);

tabput(“c”, “ccc”);

tabput(“d”, “ddd”);

Iterator iterator_1 = tabkeySet()iterator();

while (iterator_1hasNext()) {

Object key = iterator_1next();

Systemoutprintln(“tabget(key) is :”+tabget(key));

}

TreeMap tmp=new TreeMap();

tmpput(“a”, “aaa”);

tmpput(“b”, “bbb”);

tmpput(“c”, “ccc”);

tmpput(“d”, “ddd”);

Iterator iterator_2 = tmpkeySet()iterator();

while (iterator_2hasNext()) {

Object key = iterator_2next();

Systemoutprintln(“tmpget(key) is :”+tmpget(key));

}

}

}

结果:

=========map=========

mapget(key) is :ddd

mapget(key) is :bbb

mapget(key) is :ccc

mapget(key) is :aaa

=========Hashtable=========

tabget(key) is :bbb

tabget(key) is :aaa

tabget(key) is :ddd

tabget(key) is :ccc

=========TreeMap=========

tmpget(key) is :aaa

tmpget(key) is :bbb

tmpget(key) is :ccc

tmpget(key) is :ddd

Hashtable-哈希表类\x0d\\x0d\以哈希表的形式存储数据,数据的形式是键值对\x0d\特点:\x0d\查找速度快,遍历相对慢\x0d\键值不能有空指针和重复数据\x0d\\x0d\创建\x0d\Hashtable ht=new \x0d\Hashtable();\x0d\\x0d\添值\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\取值\x0d\\x0d\String str=htget(1);\x0d\Systemoutprintln(str);// Andy\x0d\\x0d\对键进行遍历\x0d\\x0d\Iterator it = htkeySet()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ Integer key = (Integer)itnext();\x0d\ \x0d\Systemoutprintln(key);\x0d\}\x0d\\x0d\对值进行遍历\x0d\\x0d\Iterator it = htvalues()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ String value =(String) itnext();\x0d\ \x0d\Systemoutprintln(value);\x0d\}\x0d\\x0d\取Hashtable记录数\x0d\\x0d\Hashtable ht=new Hashtable();\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\int i=htsize();// 7\x0d\\x0d\删除元素\x0d\\x0d\Hashtable ht=new Hashtable();\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\htremove(1);\x0d\htremove(2);\x0d\htremove(3);\x0d\htremove(4);\x0d\\x0d\Systemoutprintln(htsize());// 3\x0d\\x0d\Iterator it = htvalues()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ // Get value\x0d\ String value =(String) \x0d\itnext();\x0d\ Systemoutprintln(value);\x0d\}

刚好自己遇到了这个问题,经过一番研究,和大家分享一下。

Vector <Hashtable<String, Object>> v= dbselect("SELECT FROM lct_t_articles ORDER BY id DESC LIMIT 10");

Hashtable<String, Object> articl=null;

for(int i=0;i<vsize();i++){

Hashtable table=vget(i);

Systemoutprintln(tableget("title"));

}

Java为数据结构中的映射定义了一个接口javautilMap,

它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap

这里介绍这4中实例的用法和区别。

关键技术剖析:

Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复。

l  (1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用CollectionssynchronizedMap(HashMap map)方法使HashMap具有同步的能力。

l  (2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。

l  (3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。

l  (4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。

  

import javautilHashMap;

import javautilHashtable;

import javautilIterator;

import javautilLinkedHashMap;

import javautilMap;

import javautilTreeMap;

 

 

public class TestMap {

  

  

   public static void init(Map map){

      if (map != null){

         String key = null;

         for (int i=5; i>0; i--){

            key = new Integer(i)toString() + "0";

            mapput(key, keytoString());

            //Map中的键是不重复的,如果插入两个键值一样的记录,

            //那么后插入的记录会覆盖先插入的记录

            mapput(key, keytoString() + "0");         }

      }

   }

  

   public static void output(Map map){

      if (map != null){

         Object key = null;

         Object value = null;

         //使用迭代器遍历Map的键,根据键取值

         Iterator it = mapkeySet()iterator();

         while (ithasNext()){

            key = itnext();

            value = mapget(key);

            Systemoutprintln("key: " + key + "; value: " + value );

         }

         //或者使用迭代器遍历Map的记录MapEntry

         MapEntry entry = null;

         it = mapentrySet()iterator();

         while (ithasNext()){

            //一个MapEntry代表一条记录

            entry = (MapEntry)itnext();

            //通过entry可以获得记录的键和值

            //Systemoutprintln("key: " + entrygetKey() + "; value: " + entrygetValue());

         }

      }

   }

  

   public static boolean containsKey(Map map, Object key){

      if (map != null){

         return mapcontainsKey(key);

      }

      return false;

   }

  

   public static boolean containsValue(Map map, Object value){

      if (map != null){

         return mapcontainsValue(value);

      }

      return false;

   }

  

   public static void testHashMap(){

      Map myMap = new HashMap();

      init(myMap);

      //HashMap的键可以为null

      myMapput(null,"ddd");

      //HashMap的值可以为null

      myMapput("aaa", null);

      output(myMap);

   }

  

   public static void testHashtable(){

      Map myMap = new Hashtable();

      init(myMap);

      //Hashtable的键不能为null

      //myMapput(null,"ddd");

      //Hashtable的值不能为null

      //myMapput("aaa", null);

      output(myMap);

   }

  

   public static void testLinkedHashMap(){

      Map myMap = new LinkedHashMap();

      init(myMap);

      //LinkedHashMap的键可以为null

      myMapput(null,"ddd");

      myMapput(null,"aaa");

      //LinkedHashMap的值可以为null

      myMapput("aaa", null);

      output(myMap);

   }

  

   public static void testTreeMap(){

      Map myMap = new TreeMap();

      init(myMap);

      //TreeMap的键不能为null

      //myMapput(null,"ddd");

      //TreeMap的值不能为null

      //myMapput("aaa", null);

      output(myMap);

   }

 

   public static void main(String[] args) {

      Systemoutprintln("采用HashMap");

      TestMaptestHashMap();

      Systemoutprintln("采用Hashtable");

      TestMaptestHashtable();

      Systemoutprintln("采用LinkedHashMap");

      TestMaptestLinkedHashMap();

      Systemoutprintln("采用TreeMap");

      TestMaptestTreeMap();

     

      Map myMap = new HashMap();

      TestMapinit(myMap);

      Systemoutprintln("新初始化一个Map: myMap");

      TestMapoutput(myMap);

      //清空Map

      myMapclear();

      Systemoutprintln("将myMap clear后,myMap空了么  " + myMapisEmpty());

      TestMapoutput(myMap);

      myMapput("aaa", "aaaa");

      myMapput("bbb", "bbbb");

      //判断Map是否包含某键或者某值

      Systemoutprintln("myMap包含键aaa  "+ TestMapcontainsKey(myMap, "aaa"));

      Systemoutprintln("myMap包含值aaaa  "+ TestMapcontainsValue(myMap, "aaaa"));

      //根据键删除Map中的记录

      myMapremove("aaa");

      Systemoutprintln("删除键aaa后,myMap包含键aaa  "+ TestMapcontainsKey(myMap, "aaa"));

      //获取Map的记录数

      Systemoutprintln("myMap包含的记录数:  " + myMapsize());

   }

}

输出结果:

采用HashMap

key: null; value: ddd

key: 30; value: 300

key: aaa; value: null

key: 40; value: 400

key: 10; value: 100

key: 50; value: 500

key: 20; value: 200

采用Hashtable

key: 40; value: 400

key: 10; value: 100

key: 30; value: 300

key: 50; value: 500

key: 20; value: 200

采用LinkedHashMap

key: 50; value: 500

key: 40; value: 400

key: 30; value: 300

key: 20; value: 200

key: 10; value: 100

key: null; value: aaa

key: aaa; value: null

采用TreeMap

key: 10; value: 100

key: 20; value: 200

key: 30; value: 300

key: 40; value: 400

key: 50; value: 500

新初始化一个Map: myMap

key: 30; value: 300

key: 40; value: 400

key: 10; value: 100

key: 50; value: 500

key: 20; value: 200

将myMap clear后,myMap空了么  true

myMap包含键aaa  true

myMap包含值aaaa  true

删除键aaa后,myMap包含键aaa  false

myMap包含的记录数:  1

源码分析:

遍历Map有两种方法:

(1)map的keySet()方法获得键的集合,再调用键集合的iterator方法获得键的迭代器,以此迭代地取出Map中的键,用get方法获得键对应的值,便完成了Map的遍历。代码如下所示:

//使用迭代器遍历Map的键,根据键取值

       Iterator it = mapkeySet()iterator();

       while (ithasNext()){

          key = itnext();

          value = mapget(key);

          Systemoutprintln("key: " + key + "; value: " + value );

       }

(2)使用Map的entrySet方法获得Map中记录的集合,每条对象都是一个MapEntry对象,使用其getKey方法获得记录的键,使用其getValue方法获得记录的值。代码如下所示:

       //或者使用迭代器遍历Map的记录MapEntry

       MapEntry entry = null;

       it = mapentrySet()iterator();

       while (ithasNext()){

          //一个MapEntry代表一条记录

          entry = (MapEntry)itnext();

          //通过entry可以获得记录的键和值

          //Systemoutprintln("key: " + entrygetKey() + "; value: " + entrygetValue());

以上就是关于C#中HashTable简介和使用用法全部的内容,包括:C#中HashTable简介和使用用法、c#中如何使用hashtable、hashmap和 hashtable以及treemap的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/9671537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存