有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles单元中定义了另一个TStringList类,采用了哈希技术存储数据,它就是THashedStringList类。下面这段代码就是摘自IniFiles单元中对THashedStringList的定义。
THashedStringList=class(TStringList)
private
FValueHash:TStringHash;
FNameHash:TStringHash;
FValueHashValid:Boolean;
FNameHashValid:Boolean;
procedureUpdateValueHash;
procedureUpdateNameHash;
protected
procedureChanged;override;
public
destructorDestroy;override;
functionIndexOf(constS:string):Integer;override;
functionIndexOfName(constName:string):Integer;override;
end;
private
FValueHash:TStringHash;
FNameHash:TStringHash;
FValueHashValid:Boolean;
FNameHashValid:Boolean;
procedureUpdateValueHash;
procedureUpdateNameHash;
protected
procedureChanged;override;
public
destructorDestroy;override;
functionIndexOf(constS:string):Integer;override;
functionIndexOfName(constName:string):Integer;override;
end;
基本的TStringList类是使用数组以线性方式保存所有子项的,所以无论使用其IndexOf方法还是IndexOfName方法都是使用线性查找法,这种查寻方法的时间复杂度在最好情况为T(1),即第一个子项即为查询项,最坏情况为T(N),N为子项个数,即查找项为最后一项。所以,当数据量比较大时其查询是毫无效率可言的。
THashedStringList类中添加了两个TStringHash私有成员,分别用来存放对其子项键名哈希表和键值哈希表。当调用其IndexOf方法或是IndexOfName方法时,此类会首先检查是否已经为键值或是键名创建哈希表,如果没有,则创建之,否则直接使用哈希算法时行查找。
functionTHashedStringList.IndexOf(constS:string):Integer;
begin
UpdateValueHash; //创建键值哈希表
ifnotCaseSensitivethen
Result:=FValueHash.ValueOf(AnsiUpperCase(S))
else
Result:=FValueHash.ValueOf(S);
end;
functionTHashedStringList.IndexOfName(constName:string):Integer;
begin
UpdateNameHash; //创建健名哈希表
ifnotCaseSensitivethen
Result:=FNameHash.ValueOf(AnsiUpperCase(Name))
else
Result:=FNameHash.ValueOf(Name);
end;
begin
UpdateValueHash; //创建键值哈希表
ifnotCaseSensitivethen
Result:=FValueHash.ValueOf(AnsiUpperCase(S))
else
Result:=FValueHash.ValueOf(S);
end;
functionTHashedStringList.IndexOfName(constName:string):Integer;
begin
UpdateNameHash; //创建健名哈希表
ifnotCaseSensitivethen
Result:=FNameHash.ValueOf(AnsiUpperCase(Name))
else
Result:=FNameHash.ValueOf(Name);
end;
学过数据结构的朋友都知道,当数据量不是很大时,如几百、几千时哈希算法的优势并不是很明显,和普通的线性查找性能差不了多少,但是随着数据量在增大,其性能的提升是相当可观的。所以建议各位程序员朋友,如果需要使用TStringList存储大数据量时,请使用THashedStringList代替。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
在Delphi环境下进行Access数据库中OLE对象的读写操作,主要涉及的几个关键知识点包括: 1. OLE对象的特点:OLE(Object Linking and Embedding)是一种技术,用于在一个文档内嵌入或链接另一个程序的对象。在Access...
在Delphi中,创建对象通常涉及到声明类的变量、使用构造函数初始化对象,以及在不再需要时使用析构函数释放对象,避免内存泄漏。类的变量存储了对对象的引用,而不是对象本身,这一点需要程序员特别注意。 #### ...
Delphi 中的流式对象 Delphi 中的流式对象是面向对象技术的重要组成部分,用于管理对象式数据。 Delphi 应用程序完全是由部件来构造的,因此开发高性能的 Delphi 应用程序必然会涉及对象式数据管理技术。 Delphi 的...
在Delphi编程中,对象参数调用是一种常见的编程实践,它涉及到传递对象实例作为函数或方法的参数。这种技术在面向对象编程中非常关键,因为它允许我们通过引用而不是拷贝来操作对象,从而提高效率并简化代码。下面将...
在Delphi中,我们可以创建类(class)来定义对象的属性(data fields)和方法(procedures and functions)。类是对象的蓝图,而对象是类的实例。通过访问控制修饰符(如private、protected和public),我们可以控制...
《Delphi面向对象编程思想刘艺》是一本深入讲解Delphi编程中面向对象技术的专业书籍。作者刘艺以其丰富的经验和深厚的理论功底,系统地阐述了面向对象编程的基本概念、原则以及在Delphi中的实际应用。这本书对于想要...
这本书由刘艺撰写,旨在帮助读者深入理解和熟练掌握面向对象编程的基本概念、原则和技巧,以及如何在实际的Delphi开发项目中有效地应用这些知识。 1. **面向对象编程(OOP)基础**: 面向对象编程是一种编程范式,...
在Delphi中,面向对象编程(OOP)是核心概念之一,它极大地增强了代码的可重用性和可维护性。本例程旨在帮助开发者理解和掌握Delphi中的面向对象特性。 面向对象编程的核心概念包括类、对象、继承、封装和多态。...
《Delphi面向对象编程思想》是由刘艺编著的一本深入探讨面向对象编程在Delphi环境中的应用的书籍。这本书因其深入浅出的讲解和实用的示例,曾深受程序员们的喜爱,虽然现在已经绝版,但其PDF版本仍然在开发者之间...
总之,面向对象编程在Delphi中扮演着至关重要的角色,刘艺的书对于希望深入理解Delphi OOP特性的开发者来说,无疑是一份宝贵的资源。通过阅读和实践书中的示例,开发者能够提升自己的编程技巧,更好地驾驭Delphi这个...
Delphi的持久性对象框架是Delphi编程中用于数据库应用的一种技术,它允许开发者将对象的状态持久化到数据库中,以便在程序运行的不同阶段能够保存和恢复对象的信息。这一框架结合了面向对象编程的特性与数据库操作,...
在Delphi中,对象是由类(Class)创建的,类是对象的蓝图,定义了对象的属性(Attributes)、方法(Methods)以及事件(Events)。通过继承(Inheritance)、多态(Polymorphism)和封装(Encapsulation)这三个面向...
本教程将详细介绍如何在 Delphi 中使用 C 生成的 OBJ 对象文件,以及如何通过示例代码来实现这一过程。 首先,理解 OBJ 文件:C 编译器将源代码编译成 OBJ 文件,这是一个二进制文件,包含汇编级别的代码、符号表和...
本篇将深入探讨Delphi的面向对象编程思想及其在实践中的应用。 首先,我们来理解面向对象编程的基本概念。面向对象编程的核心是类(Class),它是对象的蓝图,定义了对象的数据结构和行为。对象是类的实例,它们...
在Delphi中,面向对象编程(OOP)是核心编程理念,它允许开发者通过类和对象来组织和设计软件。面向对象编程的思想包括封装、继承和多态,这些概念在Delphi中得到了深入的应用。 首先,我们来看"封装"。封装是OOP的...
面向对象编程(Object-Oriented Programming,OOP)是Delphi的核心特性,也是现代软件开发中的重要概念。本电子书《Delphi面向对象编程思想》将深入探讨这一主题。 在面向对象编程中,程序被设计为一系列相互作用的...
在Delphi这种强类型、事件驱动的环境中,面向对象编程的思想尤其重要。 首先,我们要理解面向对象的基本概念:类(Class)、对象(Object)、继承(Inheritance)、多态(Polymorphism)和封装(Encapsulation)。...
下面是一个简单的调用DLL中对象的示例: ```delphi uses ComObj; var MyDLLObject: IMyInterface; begin OleCheck(CoCreateInstance(CLASS_MyDLLObject, nil, CLSCTX_LOCAL_SERVER, IMyInterface, MyDLLObject)...
通过学习本书《delphi面向对象编程思想》,开发者不仅可以深入了解面向对象编程的基本概念,还可以掌握如何在实际项目中有效地应用这些概念和技术。这对于提升编程技能和开发高质量的应用程序至关重要。
Delphi作为一种全面支持面向对象编程的语言,在程序设计中引入了一系列核心概念,包括类、对象、封装、继承、多态性和抽象性。本文旨在深入探讨Delphi如何支持这些面向对象的特性,并通过具体的例子帮助读者更好地...