Map键的最快方法是什么:Enum.valueOf(~)与String.hashCode()?

3

我很难比较这两个。所以我向比我更具体知识的人求助。 我必须将一个功能对象链接到一个名称(当然是字符串),函数调用类似于:

serviceInstance.useThis(String name, Object parameter);

目前我正在考虑这个API的“后端”有三个选项:

  1. 枚举 + EnumMap
  2. 纯枚举
  3. HashMap

1和2基本相同,但1是为了在其他用途中重用枚举而存在。 我的主要关注点归结为Enum.valueOf(String name)与String.hashCode()相比速度如何?

以下是我正在尝试的两种实现:

public class HashMapHandlerType{

    static HashMap<String, MyInterfaceProvider> handlers = ~ ;

    public void useThis(String name, Object parameter) throws IllegalArgumentException {
        MyInterfaceProvider prov = handlers.get(name);
        if(prov != null){
            prov.get().use(parameter);
        }else{
            throw new IllegalArgumentException(name);
        }
    }

}

public class EnumTypeHandler{

    public void useThis(String name, Object parameter) throws IllegalArgumentException {
        HandlersEnum.valueOf(name).get().use(parameter);
    }

}

使用枚举的优点是,在使用EnumMap时不必担心冲突的问题。 但是,相对于String.hashCode()并处理哈希函数中可能出现的冲突,Enum的valueOf是否足够快?


你所说的“快”是什么意思? - user2472706
我猜测这里涉及到复杂度和执行时间。假设字符串是“new”,并且哈希码在之前的操作中没有被计算过。 - le-doude
你的地图有多大?你要插入什么类型的数据? - user2472706
我正在考虑多达一百个元素。字符串的值是任意的,但可以假定它们接近英语名词。 - le-doude
我会选择HashMap。据我所知,使用枚举键作为名称并不理想。 - user2472706
1
Enum.valueOf 将委托到后端的 HashMap - Louis Wasserman
2个回答

3
路易斯·瓦特曼的评论回答了具体的问题。这是一个更一般性的解答,教你如何处理这种类似的问题。
  • 将数据结构及其访问方法封装在一个类中,这样只有该类的代码依赖于设计选择。
  • 编写最简单、最清晰、最易维护的实现选项。
  • 测量程序的性能。
  • 如果需要更快的速度,请进行分析。
  • 如果分析显示与数据结构相关的方法占用了相当比例的时间,请编写和测试一个或多个备选实现。选择最快的。

这有两个主要优点。如果问题最后不重要,因为最简单的实现已经足够快,你就没有浪费时间。如果相对性能问题确实很重要,你可以在实际程序、真实数据的情况下进行测量。


3

使用valueOf时,它基本上会懒惰地创建一个映射。此外,在创建映射时,它使用反射来获取值。由于与在您的情况下已经计算出的String.hashCode()相比,反射调用肯定是昂贵的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接