Delphi中的THashedStringList对象
来源:互联网 发布:网络统考是看答案抄吗 编辑:程序博客网 时间:2024/05/21 07:14
Delphi中的THashedStringList对象
有许多程序员都喜欢使用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中的THashedStringList对象
- Delphi中的THashedStringList对象
- Delphi中的THashedStringList对象
- Delphi 中的哈希表(1): THashedStringList
- Delphi 中的哈希表(1): THashedStringList
- Delphi 中的哈希表(1): THashedStringList
- Delphi中Hash表的使用方法(THashedStringlist)
- Delphi 中哈希表TStringHash和THashedStringList性能速度
- Delphi中的对象编程
- Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较
- Delphi中的类和对象
- Delphi中的类和对象
- 谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比
- 谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比
- 谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比
- 【转】谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比
- 谈谈Delphi中的类和对象
- delphi中的对象其实也是一种指针
- 如何对hadoop作业的某个task进行debug单步跟踪
- Linux 内核中的 GCC 特性
- DownloaderTest | Http协议 | 断点续传 | Thread
- Keil软件仿真的串口调试技巧
- xfire客户端代码调用2
- Delphi中的THashedStringList对象
- internetopen、internetOpenUrl、InternetReadFile,urldownloadtofile
- 正斜杠与反斜杠的分析
- js传递中文参数的url到asp(jscript)解释得到的中文参数为乱码的解决方法
- 杀死进程命令kill,pkill,killall,xkill
- .NET调用新浪微博开放平台接口的代码示例
- [转] Windows下的Memcache安装
- 简易的TCP完成端口库
- 如何定制Bonita Rest, 去掉JAAS用户认证