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

时间:2013-02-04 08:26:45

标签: java map

当给定例程名称时,我有大约30个处理程序例程以String形式分派。 因此,在工厂方法中,调度例程的一种自然方式是使用一系列if...else来比较常规名称以适合插槽。它起作用,但毫无疑问,随着惯例数量的增加,它是笨拙和低效的。

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

据我所知,当实例数小于 64(长类型长度)时,EnumMap实现使用long作为位数组并使用位偏移来执行putget,所以它非常快,只要常规数量少,我就可以在调度例程时获得O(1)性能超过64(非常适合我的情况)。

但是, EnumMap 的限制是其key type只能是Enum,而不是String, 我无法使用例程名称(string)来快速查找....

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

1 个答案:

答案 0 :(得分:2)

我会保持简单,只需使用HashMap<String, Handler>,直到你可以证明这是一个严重的瓶颈。我在这里假设你的所有处理程序都有一个共同的超类或接口,所以你可以这样做

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

如果您从String键开始,EnumMap将不会更快,因为您首先必须使用valueOf来获取与该字符串对应的枚举值,并且this is itself implemented as a lookup in a HashMap ... < / p>