Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用EnumMap进行qiuck查找?_Java_Map - Fatal编程技术网

如何在Java中使用EnumMap进行qiuck查找?

如何在Java中使用EnumMap进行qiuck查找?,java,map,Java,Map,当以字符串形式给出例程名称时,我有大约30个处理程序例程要分派。 因此,在工厂方法中,分派例程的一种自然方式是使用一系列的if…else来比较例程名称以适合插槽。它是有效的,但毫无疑问,随着例行程序数量的增加,它是笨拙和低效的 我想出了一种使用enum和EnumMap的方式:每当我添加例程时,我都会添加一个enum实例,并在EnumMap中注册它(例程名称和例程类作为键和值) 据我所知,当实例数小于64(长类型长度)时,EnumMap实现使用long作为位数组,并使用位偏移量执行put和get,

当以字符串形式给出例程名称时,我有大约30个处理程序例程要分派。 因此,在工厂方法中,分派例程的一种自然方式是使用一系列的
if…else
来比较例程名称以适合插槽。它是有效的,但毫无疑问,随着例行程序数量的增加,它是笨拙和低效的

我想出了一种使用enum和EnumMap的方式:每当我添加例程时,我都会添加一个enum实例,并在EnumMap中注册它(例程名称和例程类作为键和值)

据我所知,当实例数小于64(长类型长度)时,EnumMap实现使用
long
作为位数组,并使用位偏移量执行
put
get
,因此速度非常快,我可以获得一个O(1)当我调度例程时,只要例程的数量少于64个(这非常适合我的情况),性能就会提高

但是,EnumMap的限制是其
键类型只能是
Enum
,而不是
字符串,
我无法使用例程名称(
string
)快速查找

有办法解决这个问题吗?
或者,如果我可以使用一个键的值进行反向查找:)

我会保持简单,只使用
HashMap
,直到您证明这是一个严重的瓶颈。我在这里假设有一个公共的超类或接口,所有处理程序都可以扩展它,所以您可以这样做

handlers.get(name).handle(...);

如果从字符串键开始,EnumMap不会更快,因为首先必须使用
valueOf
来获取与字符串对应的枚举值,并且…

为什么不使用
HashMap
?它对你来说太慢了吗?为什么给你一个字符串形式的例程名?有可能使用多态方法来避免整个问题吗?@Nikita Beloglazov,事实上我现在使用它,我只是想知道EnumMap如何,嗯。。也许这不是一个好的选择。@EJP,是的,这是一种优雅的OOP方式,但我无法控制另一部分。