Map键的最快速度是什么:Enum.valueOf(〜)vs String.hashCode()?

时间:2014-06-17 00:49:43

标签: java enums hashmap

我很难比较这两者。所以我吸引那些比我更详细的人。 我必须将一个功能对象链接到一个名称(当然是String ...),函数调用是这样的:

serviceInstance.useThis(String name, Object parameter);

到目前为止,我正在考虑"后端"这个API:

  1. enum + EnumMap
  2. pure enum
  3. HashMap中
  4. 1和2基本相同,但如果我需要重用enum用于其他用途,则为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,Enum的优点并不是担心会发生碰撞。 但是Enum的valueOf是否足以赢得String.hashCode()+在哈希函数中处理潜在的冲突?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Louis Wasserman的评论回答了具体问题。这是如何处理这类问题的更一般的答案。

  • 将数据结构及其访问方法封装在一个类中,所以 只有那个类的代码取决于设计选择。
  • 编写最简单,最干净,最易维护的实现选项。
  • 衡量节目的表现。
  • 如果需要更快,请简介。
  • 如果配置文件显示与数据结构关联的方法占很大一部分时间,则编写并测量一个或多个替代实现。选择最快。

这有两个主要优点。如果问题不重要,因为最简单的实施足够快,你不会浪费任何时间。如果相对性能问题很重要,则可以使用实际数据在实际程序的上下文中进行测量。