Delphi中的THashedStringList对象

转载 2016年05月30日 14:27:16

有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是 TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles 单元中定义了另一个TStringList类,采用了哈希技术存储数据,它就是THashedStringList类。下面这段代码就是摘自 IniFiles单元中对THashedStringList的定义。

 

THashedStringList = class(TStringList)
private
    FValueHash: TStringHash;
    FNameHash: TStringHash;
    FValueHashValid: Boolean;
    FNameHashValid: Boolean;
    procedure UpdateValueHash;
    procedure UpdateNameHash;
protected
    procedure Changed; override;
public
    destructor Destroy; override;
    function IndexOf(const S: string): Integer; override;
    function IndexOfName(const Name: string): Integer; override;
end;
    基本的TStringList类是使用数组以线性方式保存所有子项的,所以无论使用其IndexOf方法还是IndexOfName方法都是使用线性查找 法,这种查寻方法的时间复杂度在最好情况为T(1),即第一个子项即为查询项,最坏情况为T(N),N为子项个数,即查找项为最后一项。所以,当数据量比 较大时其查询是毫无效率可言的。

    THashedStringList类中添加了两个TStringHash私有成员,分别用来存放对其子项键名哈希表和键值哈希表。当调用其 IndexOf方法或是IndexOfName方法时,此类会首先检查是否已经为键值或是键名创建哈希表,如果没有,则创建之,否则直接使用哈希算法时行 查找。

function THashedStringList.IndexOf(const S: string): Integer;
begin
UpdateValueHash; //创建键值哈希表
if not CaseSensitive then
    Result := FValueHash.ValueOf(AnsiUpperCase(S))
else
    Result := FValueHash.ValueOf(S);
end;

function THashedStringList.IndexOfName(const Name: string): Integer;
begin
UpdateNameHash; //创建健名哈希表
if not CaseSensitive then
    Result := FNameHash.ValueOf(AnsiUpperCase(Name))
else
    Result := FNameHash.ValueOf(Name);
end;
    学过数据结构的朋友都知道,当数据量不是很大时,如几百、几千时哈希算法的优势并不是很明显,和普通的线性查找性能差不了多少,但是随着数据量在增大,其 性能的提升是相当可观的。所以建议各位程序员朋友,如果需要使用TStringList存储大数据量时,请使用THashedStringList代替。

相关文章推荐

Delphi中Hash表的使用方法(THashedStringlist)

TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在其数据项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内...

Delphi面向对象编程的20条规则

====================================================== 注:本文源代码点此下载 =============================...

Delphi中的Sender:TObject对象解析

 Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Pro...
  • jl_tiny
  • jl_tiny
  • 2014年04月23日 17:05
  • 5724

用DELPHI的RTTI实现数据集的简单对象化(zt)

DELPHI的RTTI实现数据集的简单对象化 [Mental Studio]猛禽 在《强大的DELPHI RTTI--兼谈需要了解多种开发语言》一文中,我说了一下我用DELPHI的RTTI实现...
  • chenday
  • chenday
  • 2011年09月25日 23:15
  • 207

Delphi面向对象学习随笔七:COM(转)

====================================================== 注:本文源代码点此下载 =============================...

Delphi面向对象设计的经验原则

Delphi面向对象设计的经验原则
  • shuaihj
  • shuaihj
  • 2011年01月09日 22:19
  • 893

delphi中对象的create和free

在D中每个应用程序可以获得的内存空间分为两种:堆(heap)和栈(stack)。       堆又称为“自由存储区”,其中的内存空间的分配与释放是必须由程序员来控制的。例如,用GetMem函数获取了...

Delphi 画布对象及其简单应用

====================================================== 注:本文源代码点此下载 =============================...

Delphi面向对象学习随笔六:接口

====================================================== 注:本文源代码点此下载 =============================...

delphi面向对象程序设计

工程保存的时候应该有一个自己的文件夹,而且要有一个有意义的名字,dpr文件管理所有的工程文件,dfm保存窗体的所有所有的信息。pas文件主要存放窗体事件的处理。                   ...
  • luolunz
  • luolunz
  • 2012年03月20日 10:39
  • 865
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中的THashedStringList对象
举报原因:
原因补充:

(最多只允许输入30个字)