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