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 中的哈希表(1): THashedStringList

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F...
  • chinajobs
  • chinajobs
  • 2016年05月30日 14:33
  • 1035

使用THashedStringList管理结构体数据()

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Sy...
  • oYaoWang123
  • oYaoWang123
  • 2015年09月02日 23:54
  • 508

Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较

本人在做一个测试,服务器是IOCP的,我假定最大连接数是50000个。 如果每个链接之间的数据需要服务器中转的话,那么我需要一个数据容器储存用户的关键数据和链接。 以上是测试背景。 ...
  • my98800
  • my98800
  • 2017年04月12日 10:20
  • 756

Delphi 中哈希表TStringHash和THashedStringList性能速度

Delphi的IniFiles单元中有两个哈希表类TStringHash和THashedStringList 【TStringHash】 优点:速度快,尤其是添加时(调用.Add)速度比T...
  • webouse
  • webouse
  • 2017年02月17日 17:08
  • 1217

delphi中Tlist的使用。

我在上面的BLOG中写到了使用指针的方法。在DELPHI中指针最常见的就是和类TLIST结合起来使用。下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识。 代...
  • u010673851
  • u010673851
  • 2016年02月25日 21:17
  • 3353

Delphi中的THashedStringList对象

有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是 TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles ...
  • chinajobs
  • chinajobs
  • 2016年05月30日 14:27
  • 481

delphi TStringList 用法详解

delphi TStringList 用法详解 //TStringList 常用方法与属性 : var   List: TStringList;   i: Integer; begin ...
  • sunylat
  • sunylat
  • 2014年05月02日 21:01
  • 9094

Delphi中的THashedStringList对象

Delphi中的THashedStringList对象有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是 TStringList本身只是对数据线性的存储,当数据量大时,对...
  • yanjiaye520
  • yanjiaye520
  • 2011年05月06日 17:36
  • 1574

【转】谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比

http://blog.csdn.net/zhmnsw/archive/2007/01/25/1493681.aspx 曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多...
  • okmnji79513
  • okmnji79513
  • 2009年10月28日 13:36
  • 2484

Delphi中的THashedStringList对象

    有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFil...
  • chris_mao
  • chris_mao
  • 2007年11月03日 00:53
  • 2693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中的THashedStringList对象
举报原因:
原因补充:

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