打印顺序就是你说的.先进先除.还是后进先出..但是原理应该和数组是一样的.对于hashtable的使用你写了一种方法迭代key还有通过迭代器来对keyset进行迭代获取hashtable中所有的key在通过get的方法获取值
//基本用法参照jdoc.. 1.5文档中介绍
public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, Serializable此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加中销载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。
通常,默认加载因子(.75)在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间(在大多数 Hashtable *** 作中,包括 get 和 put *** 作,都反映了这一点)。
初始容量主要控制空间消耗与执行 rehash *** 作所需要的时间损耗之间的平衡。如果初始容量大于 Hashtable 所包含的最大条目数除以加载因子,则永远 不会发生 rehash *** 作。但是,将初始容量设置太高可能会浪费空间。
如果很多条目要存储在一个 Hashtable 中,那么与根据需要执行自动 rehashing *** 作来增大表的容量的做法相比,使用足够大的初始容量创建哈希表或许可以更有效地插入条目。
下面这个示例创建了一个数字的哈希表。它将数字的名称用作键:
Hashtable numbers = new Hashtable()
numbers.put("one", new Integer(1))
numbers.put("two", new Integer(2))
numbers.put("three", new Integer(3))
要检索一个数字,可以使用以下代码:
Integer n = (Integer)numbers.get("two")
if (n != null) {
System.out.println("two = " + n)
}
自 Java 2 平台 v1.2 以来,此类已经改进为可以实现 Map,因此它变成了 Java Collections Framework 的一部分。与新集合的实现不同,Hashtable 是同步的。
由迭代器返回族仿的 Iterator 和由所有 Hashtable 的“collection 视图方法”返回的 Collection 的 listIterator 方法都是快速失败 的:在创建 Iterator 之后,如果从结构上对 Hashtable 进行修改,除非通过 Iterator 自身的移除或添加方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出 ConcurrentModificationException。因此,面对并发的修改,Iterator 很快就会完全失败,而不冒在将兆培纤来某个不确定的时间发生任意不确定行为的风险。由 Hashtable 的键和值方法返回的 Enumeration 不 是快速失败的。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误。
你不用自己手动做这些事情,可以让编译器帮你。你所要作的就是把GetProcAddress后获得的函数入口地址强制类型转换成你自己定义的特定类型的函数指针,然后当你用这个函数指针去调用DLL中的函数时编译器就会按照你对这个函数指针的类型定义去完成参数的压栈、清除等 *** 作。
举个例子,比方说你已经知道你要调用的动态连接库中的函数有一个整型参数,而且没有返回值,那你就可以
1. 事先进行如下类型定义:
typedef void (*MYPROC)(int)
2. 在你的程序里定义一个该类型的函数指针:
MYPROC ProcAdd
3. 调用GetProcAddress时把它返回的地址早租铅强制类型转换成你定义的类型:
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts")
4. 然后陆好你要调用该函数的时候就可以这样用:
(ProcAdd) ( 2 /* 随便一个整型的参数,视你程序的需要而定 */ )
这里的关键就是你要事先知道你型并调用的dll中的函数都有些什么参数以及返回值是怎样的。
还有一点要注意的就是函数调用方式。用VC++编写的动态连接库都是用__stdcall,而C/C++的缺省函数调用方式是__cdecl,不能搞错,否则程序就跑飞了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)